GotAI.NET

Форум: Проблемы искусственного интеллекта

 

Регистрация | Вход

 Все темы | Новая тема Стр.8 (15)<< < Пред. | След. > >>   Поиск:  
 Автор Тема: На: Как получить значения множественных(точками) аргументов функции в Си?
гость
103.251.167.*
На: Как получить значения множественных(точками) аргументов функции в Си?
Добавлено: 11 авг 22 8:54
Цитата:
Автор: гость


есть функция типа

void func(int v1,...)
{
как получить ззанчения всех аргументов которые с точками? (...)
}
Более насущный вопрос, как в Си или С++ получить размер выделенной динамической памяти по указателю?


....
void* p = malloc(42);
.....


как из p получить 42?
[Ответ][Цитата]
Дмитрий Пагода
Сообщений: 151
На: Как получить значения множественных(точками) аргументов функции в Си?
Добавлено: 12 авг 22 2:27
Изменено: 12 авг 22 2:29
Цитата:
Автор: гость

Более насущный вопрос, как в Си или С++ получить размер выделенной динамической памяти по указателю?


....
void* p = malloc(42);
.....


как из p получить 42?


А в чем собственно "насущность"? Без этой фишки 50 лет обходились, наверно она не так уж и нужна.

Есть ещё гугл :
Цитата:

There is no way to know the size of a dynamically allocated array, you have to save it somewhere else.

[Ответ][Цитата]
гость
103.251.167.*
На: Как получить значения множественных(точками) аргументов функции в Си?
+1
Добавлено: 13 авг 22 5:14
Цитата:
Автор: Дмитрий Пагода



А в чем собственно "насущность"? Без этой фишки 50 лет обходились, наверно она не так уж и нужна.

Есть ещё гугл :

Что значит "в чем насущность", на Си код вообще писали? В c# или java голый масив имеет свойство размера, это очень удобно, не нужно заморачиваться с порождением новых структур данных, которые имеют дополнительный оверхед по перфомансу и усложняют код. Да и вообще не только массивы, а и отдельные обьекты тогда можно тип распознавать по голому указателю. А в нативном Си нет коллекций и прочих плюшек STL как в с++.
[Ответ][Цитата]
daner
Сообщений: 4633
На: Как получить значения множественных(точками) аргументов функции в Си?
Добавлено: 13 авг 22 22:07
Цитата:
Автор: гость

Что значит "в чем насущность", на Си код вообще писали? В c# или java голый масив имеет свойство размера, это очень удобно, не нужно заморачиваться с порождением новых структур данных, которые имеют дополнительный оверхед по перфомансу и усложняют код. Да и вообще не только массивы, а и отдельные обьекты тогда можно тип распознавать по голому указателю. А в нативном Си нет коллекций и прочих плюшек STL как в с++.


ну так и пишите на c# или java, если не хотите заморачиваться с хранением длинны массива (что в принципе не сложно, достаточно сделать свой небольшой struct и работать через него). в С много чего еще нет, если вы не заметили.
[Ответ][Цитата]
Дмитрий Пагода
Сообщений: 151
На: Как получить значения множественных(точками) аргументов функции в Си?
Добавлено: 14 авг 22 2:29
Цитата:
Автор: гость

это очень удобно, не нужно заморачиваться с ...
У Вас вероятней всего просто "эйфория новичка", состояние "как же я прекрасен!"(эффект Даннинга-Крюгера ).



Но лет через 5-10 постепенно до Вас дойдёт что все вот такие базовые вещи уже давно вылизаны до блеска, квази-оптимальны, это происходит путём наступания на все грабли при написании миллиардов строчек кода всем человечеством. Уж поверьте если бы оно было реально надо то оно бы было реализовано.

Нужно доверять людям, коллективному уму всех программистов, не считать себя самым умнее всего человечества, это 100% не так.
[Ответ][Цитата]
гость
46.166.139.*
На: Как получить значения множественных(точками) аргументов функции в Си?
Добавлено: 14 авг 22 4:50
Цитата:
Автор: Дмитрий Пагода



А в чем собственно "насущность"? Без этой фишки 50 лет обходились, наверно она не так уж и нужна.

Есть ещё гугл :

ну понятно что в пракетическом смысле может и не важно, но чисто в качестве загадки для гиков-девственников или местных психов которые atof переписывают может и заинтересовать

в самом деле ведь гдето число это хранится(иначе как может работать free(ptr) или delete ), но нужно ковыряться в компиляторе(ах) чтобы выяснить, а это для совсем ёбнутых занятие
[Ответ][Цитата]
daner
Сообщений: 4633
На: Как получить значения множественных(точками) аргументов функции в Си?
Добавлено: 14 авг 22 8:19
Цитата:
Автор: гость

ну понятно что в пракетическом смысле может и не важно, но чисто в качестве загадки для гиков-девственников или местных психов которые atof переписывают может и заинтересовать

в самом деле ведь гдето число это хранится(иначе как может работать free(ptr) или delete ), но нужно ковыряться в компиляторе(ах) чтобы выяснить, а это для совсем ёбнутых занятие


можно и не в компиляторе, благо народ уже поковырялся. просто тот размер который выделяется в памяти не всегда соответствует количеству элементов. плюс, формат того как это реализовано тоже теоретически может меняться.
[Ответ][Цитата]
гость
103.251.167.*
На: Как получить значения множественных(точками) аргументов функции в Си?
Добавлено: 14 авг 22 11:14
Цитата:
Автор: гость

ну понятно что в пракетическом смысле может и не важно, но чисто в качестве загадки для гиков-девственников
Какие нах. гики-девстенники, это важно именно в практическом смысле.
Цитата:
Автор: daner

можно и не в компиляторе, благо народ уже поковырялся. просто тот размер который выделяется в памяти не всегда соответствует количеству элементов. плюс, формат того как это реализовано тоже теоретически может меняться.
Где глянуть результаты ковыряний? Теорию куда подальше, практика млять, прак-ти-ка!
[Ответ][Цитата]
гость
103.251.167.*
На: Как получить значения множественных(точками) аргументов функции в Си?
Добавлено: 14 авг 22 11:18
Цитата:
Автор: Дмитрий Пагода

Нужно доверять людям, коллективному уму всех программистов, не считать себя самым умнее всего человечества, это 100% не так.
Сходите к психиатру.
[Ответ][Цитата]
daner
Сообщений: 4633
На: Как получить значения множественных(точками) аргументов функции в Си?
Добавлено: 14 авг 22 11:37
Цитата:
Автор: гость

Какие нах. гики-девстенники, это важно именно в практическом смысле.
Где глянуть результаты ковыряний? Теорию куда подальше, практика млять, прак-ти-ка!


практика, это когда сам. у вас ручки отсохли?
[Ответ][Цитата]
гость
103.251.167.*
На: Как получить значения множественных(точками) аргументов функции в Си?
Добавлено: 15 авг 22 3:34
Цитата:
Автор: daner



практика, это когда сам. у вас ручки отсохли?
Зачем тогда спрашивал бы? Что конкретно делать ручками?

Народ, завязывайте с психологией труда и воспитанием, скажите просто — "НЕ - ЗНА - Ю", или мудро промолчите, стыдясь своей не компетентности, а речи про команды и мотивацию оставьте своим киндерам и женушке.
[Ответ][Цитата]
daner
Сообщений: 4633
На: Как получить значения множественных(точками) аргументов функции в Си?
Добавлено: 15 авг 22 9:40
Изменено: 15 авг 22 21:21
Цитата:
Автор: гость

Зачем тогда спрашивал бы? Что конкретно делать ручками?

Народ, завязывайте с психологией труда и воспитанием, скажите просто — "НЕ - ЗНА - Ю", или мудро промолчите, стыдясь своей не компетентности, а речи про команды и мотивацию оставьте своим киндерам и женушке.


какие команды и мотивации? Я же прямо объяснил, почему несмотря на то, что размер выделяемой памяти сохраняется, использовать его вместо размера массива нерационально и неправильно. кроме того, есть разница между оператором new и malloc. если совсем коротко, то хранят они эти размеры прямо до пойнтера, ну в общем это реализация, и теоретически может быть и как-то по-другому (то есть никто такое не гарантирует).

на практике, для malloc, сделайте кастинг поинтеру на size_t* , декрементируйте один раз (или возьмите минус первый элемент, как в массиве) и все. Но это размер выделенной памяти, которая вполне себе может быть выровнена, а значит вы не сможете получить из неё количество элементов.
[Ответ][Цитата]
гость
103.251.167.*
На: Как получить значения множественных(точками) аргументов функции в Си?
Добавлено: 16 авг 22 2:41
Цитата:
Автор: daner

на практике, для malloc, сделайте кастинг поинтеру на size_t* , декрементируйте один раз (или возьмите минус первый элемент, как в массиве) и все. Но это размер выделенной памяти, которая вполне себе может быть выровнена, а значит вы не сможете получить из неё количество элементов.


Эврика! Респектище! Вы — реально шарите!

У меня правда получилось не с декрементом 1 и даже не 2 а почему то 3, хотел было уже вас осуждать, но попробовал первые 8 и ОПА!!! нашлось число!

Класс! Спасибо!


size_t* p = malloc(123456);

for (int i = 0; i < 8; ++i)
{
printf("%i\t%u\n", i, p[-i]);
}

printf("%u\n", p[-3]);

/*
0 3452816845
1 4261281277
2 86
3 123456
4 1
5 0
6 0
7 23257664
123456
*/
[Ответ][Цитата]
Дмитрий Пагода
Сообщений: 151
На: Как получить значения множественных(точками) аргументов функции в Си?
Добавлено: 16 авг 22 5:58
Изменено: 16 авг 22 5:59
Цитата:
Автор: гость

У меня правда получилось не с декрементом 1 и даже не 2 а почему то 3,
А вы не подумали что код который использует такие трюки будет непереносимым? У danera на его железе(ОС, компиляторе, битности и тп) одно смещение у вас другое у меня будет третье, нафиг такой код нужен?


void* malloc_len(int len)
{
int int_size = sizeof(int);
int* ptr = malloc(len + int_size);
memcpy(ptr, &len, int_size);
return ptr + 1;
}

int ptr_len(void* ptr)
{
return *((int*)ptr - 1);
}

С другой стороны зачем эти танцы с бубном, если структуры по сути также устроенны, последовательно байты членов записаны(если не брать в счет сдвиги из за "выравнивания") а для доступа к членам, есть готовые функции.

Короче фигнёй маятесь вы, если брать практическое применение этого "знания". Это может пригодится разве что если вы свой будете компилятор писать(что явно не ваш уровень), но не для прикладных программ и даже не для драйверов и микроконтроллеров.

На вашем месте я бы на веб больше ориентировался, на вёрстку( html\css), ну или пайтон, короче где не нужно заморачиваться так.
[Ответ][Цитата]
daner
Сообщений: 4633
На: Как получить значения множественных(точками) аргументов функции в Си?
Добавлено: 16 авг 22 8:40
Цитата:
Автор: гость 103.251.167.*
У меня правда получилось не с декрементом 1 и даже не 2 а почему то 3, хотел было уже вас осуждать, но попробовал первые 8 и ОПА!!! нашлось число!


Цитата:
Автор: Дмитрий Пагода
А вы не подумали что код который использует такие трюки будет непереносимым? У danera на его железе(ОС, компиляторе, битности и тп) одно смещение у вас другое у меня будет третье, нафиг такой код нужен?


так не только "непереносимый" там из-за выравнивания, он память выделяет чуть больше и именно этот размер хранит. не знаю почему у гостя точное число выресовалось, но у меня четко идет размер с выравниванием на 16. а значит, получить размер массива вообще не выйдет. из-за этого, new таскает с собой еще и кол-во элементов, так как ему надо в delete вызывать дестракторы на каждый элемент, в этом и их разница и причина почему они объязательно парами должны использоваться (т.е. malloc/free, new/delete)

[Ответ][Цитата]
 Стр.8 (15): 1  ...  4  5  6  7  [8]  9  10  11  12  ...  15<< < Пред. | След. > >>