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).

★★

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

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)

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

Типичный погромист на 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)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.