LINUX.ORG.RU

Си warning: assignment makes integer from pointer without a cast

 


0

2
/* file.c */
struct _Str {
....
  int      *amount_of_numbers;
....
};

int main(int argc, char *argv[]) {

Str *s;
...
call_funct (s);
...
}

static void call_funct(Str *s) {

int amount;
...
amount = s->amount_of_numbers;
...
}

Как правильно сделать приведение типов, чтобы компилятор не ругался?:

file.c:672:17: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
  amount = s->amount_of_numbers;
Нужно присвоить переменной amount значение по ссылке из структуры (int).

★★★

Последнее исправление: nvl (всего исправлений: 1)

Зависит от цели. Если просто «чтобы не ругался» — то, вкурив сообщение компилятора, тупо кастом :) Но... надо принять во внимание твою истинную цель.

slackwarrior ★★★★★
()
Ответ на: комментарий от former_anonymous

компилятор не ругается, но программа: Segmentation fault (core dumped)

nvl ★★★
() автор топика
Ответ на: комментарий от slackwarrior

Программа работает, но не приятна ругань компилятора. Собственно цель - понравиться компилятору. Что значит «тупо кастом»?

nvl ★★★
() автор топика
Ответ на: комментарий от nvl

ты в инт пытаешься сунуть значение указателя на инт.

amount = *(s->amount_of_numbers);

а крешится потому, что

Str *s;

хреново указатель ты изготавливаешь.

попробуй

Str s;
call_func(&s);

только если и в классе (в объекте) amount_of_numbers у тебя будет дохлый, все равно ёкнется.

conalex ★★★
()
Последнее исправление: conalex (всего исправлений: 3)
Ответ на: комментарий от slackwarrior

Так я и спрашиваю, как правильно сделать приведение типов, чтоб компилятор не ругался.

nvl ★★★
() автор топика

Как правильно сделать приведение типов, чтобы компилятор не ругался?

Типичный погромист на C. Ему не надо «как корректно», ему надо «сделать каст, чтобы компилятор не ругался».

anonymous
()
Ответ на: комментарий от anonymous

Типичный погромист на C. Ему не надо «как корректно», ему надо «сделать каст, чтобы компилятор не ругался».

1. Я не программист.

2. Мне нужно присвоить переменной amount значение по ссылке из структуры (int). Что собственно и происходит. Но компилятор ругается и хочется сделать «как корректно».

nvl ★★★
() автор топика
Ответ на: комментарий от deadNightTiger

int *amount_of_numbers; Звездочку убери. А лучше покажи весь исходник, чтобы не гадать.

Нельзя, весь жизненый цикл переменная s должна существовать как указатель, без локальных копий. Иначе ничего не будет работать, т.к. указатель s передается во все функции.

nvl ★★★
() автор топика
Ответ на: комментарий от nvl

В структуре лежит не значение int, а указатель на int (int *), что разные вещи, вот он и ругается. Убери в определении структуры звёздочку, как тебе уже говорили.

Кроме того, в программе объявляется не переменная s типа Str, а неинициализированный указатель на неё типа Str*, но программа обращается к этому неинициализированному указателю (по сути к случайной ячейке памяти, может даже к нулевому адресу), как к нормальной структуре. Напиши вместо Str * s просто Str s, инициализируй поля разумными значениями, а в функцию передавай по ссылке &s. Об этом тебе тоже говорили.

Ну и желательно синтаксис языка подучить, особенно всё, что касается указателей — в Си/Си++ это самая скользкая тема.

aureliano15 ★★
()
Ответ на: комментарий от aureliano15

Да, посмотрел чужой аналогичный код. Действительно наверное должно быть

int amount_of_numbers а не int * amount_of_numbers.

Всем спасибо! Храни вас Ричард!

nvl ★★★
() автор топика
Ответ на: комментарий от deadNightTiger

Зачистил звездочки, компилятор больше не ругается и вроде нигде ничего не отвалилось, все работает. Спасибо.

nvl ★★★
() автор топика
Ответ на: комментарий от Iron_Bug

Что такое K&R?

Из интереса, в данном случае так правильно?:

static void call_funct(Str *s) {
int amount =0, temp_var = 0;
...
&temp_var = s->amount_of_numbers;
amount = temp_var;
...
}

Или как-то проще это делается?

nvl ★★★
() автор топика
Ответ на: комментарий от nvl

Что такое K&R?

книга Kernighan and Ritchie: https://ru.wikipedia.org/wiki/Язык_программирования_Си_(книга)

основы С.

ты пытаешься гадать на кофейной гуще. а надо понимать, что ты делаешь. если ты в мелочах не понимаешь, значит дальше будет только говнокод. чтобы не плодить говнокод, надо разобраться с основами С, а потом уже писать программы.

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

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.