2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2, 3, 4, 5  След.
 
 Возврат структуры из функции
Сообщение19.07.2023, 05:15 
Заслуженный участник


18/01/15
3104
Уважаемые специалисты по программированию,
не могли бы вы мне помочь со следующим затруднением ?

Разбираюсь со структурами в Си.
Имеется следующая простая программа:

Код:
#include <stdio.h>

struct vect { int x; int y;};
struct vect sum_vect(struct vect, struct vect);

struct vect sum_vect(struct vect vect1, struct vect vect2)
{
   struct vect otvet;
   otvet.x=vect1.x+vect2.x;
   otvet.y=vect1.y+vect2.y;

   return otvet;
}

main()
{
   struct vect vect1, vect2, vect3;
   vect1.x=1; vect1.y=2; vect2.x=3; vect2.y=4;
   vect3=sum_vect(vect1,vect2);

   printf("vect3.x=%d,    vect3.y=%d\n", vect3.x, vect3.y);

  return 0;
}


Компилируется нормально, а при выполнении происходит сбой (сообщение "Прекращена работа программы ... ").

Хочу узнать, это я чего-то не понимаю, или компилятор неправильно работает ?

 Профиль  
                  
 
 Re: Возврат структуры из функции
Сообщение19.07.2023, 08:24 
Аватара пользователя


28/10/21
99
vpb в сообщении #1601548 писал(а):
Хочу узнать, это я чего-то не понимаю, или компилятор неправильно работает ?


int main()

В остальном никаких проблем в коде не видно.

vpb в сообщении #1601548 писал(а):
Компилируется нормально, а при выполнении происходит сбой (сообщение "Прекращена работа программы ... ").


Именно сбой? А то ведь прекращение работы программы совсем не обязательно означает сбой...

 Профиль  
                  
 
 Re: Возврат структуры из функции
Сообщение19.07.2023, 09:17 
Заслуженный участник
Аватара пользователя


01/09/13
4320
Кстати да, а как запускается программа?

 Профиль  
                  
 
 Re: Возврат структуры из функции
Сообщение19.07.2023, 11:39 
Заслуженный участник
Аватара пользователя


16/07/14
8469
Цюрих
Чем компилируется, как запускается, в чем именно "сбой"?
Просто код
Используется синтаксис C
#include <stdio.h>
int main(int argc, char* argv[]) { printf("hello world\n"); return 0;}
тем же способом запускается нормально?

 Профиль  
                  
 
 Re: Возврат структуры из функции
Сообщение19.07.2023, 12:28 
Аватара пользователя


27/07/16
556
а где выделяется память для переменной типа структура otvet? Она же описана внутри функции. Может я чего позабыл, но нет ли здесь засады))

 Профиль  
                  
 
 Re: Возврат структуры из функции
Сообщение19.07.2023, 15:12 
Заслуженный участник


18/01/15
3104
Спасибо за ответы.
TheRuinedMap в сообщении #1601553 писал(а):
В остальном никаких проблем в коде не видно.
Да вот и я их не увидел...
mihaild в сообщении #1601598 писал(а):
тем же способом запускается нормально?
Да, нормально.

Компилятор TinyC (некогда, лет 7 назад, найденный мною в интернете и с тех пор используемый).

Исходный файл --- в точности, как приведен в стартовом сообщении, имя его upr_struct_2.c (что означает "второе упражнение на структуры"). Командой
" tcc -o upr_struct_2.exe upr_struct_2.c" получается файл upr_struct_2.exe. После чего он запускается.
Результат: печать "2 0" (а должно быть, конечно, "4 6"), после чего системное сообщение об ошибке
"Прекращена работа программы "upr_struct_2.exe". Возникшая проблема привела к прекращению работы программы. Закройте эту программу." и кнопочка "Закрыть программу" (т.е. обычное сообщение о вылете программы).

Всё происходит на обычном компьютере, довольно старом. ОС Виндоус 7. Также, под оболочкой Far portable. Но Far и Windows ни при чем, я попытался запустить в безопасном режиме с командной строкой, результат тот же (сначала печать неверного ответа, потом как будто виснет, через полминуты выход (без сообщения об ошибке)).

(Замечу еще, что до сих пор я структурами не пользовался, обходился. )

 Профиль  
                  
 
 Re: Возврат структуры из функции
Сообщение19.07.2023, 15:30 
Заслуженный участник
Аватара пользователя


16/07/14
8469
Цюрих
Попробуйте в начало main печать еще чего-нибудь добавить - нормально напечатает? И удалите на всякий случай upr_struct_2.exe перед рекомпиляцией.
Выглядит очень странно, код правильный, ощущение что запускается не он.

 Профиль  
                  
 
 Re: Возврат структуры из функции
Сообщение19.07.2023, 15:44 
Заслуженный участник


31/12/05
1480
Какая у вас версия TinyC? Может быть, вы ее 7 лет не обновляли, а может быть, даже 7 лет назад взяли не самую свежую.

 Профиль  
                  
 
 Re: Возврат структуры из функции
Сообщение19.07.2023, 17:19 
Заслуженный участник


18/01/15
3104
mihaild в сообщении #1601652 писал(а):
Попробуйте в начало main печать еще чего-нибудь добавить - нормально напечатает? И удалите на всякий случай upr_struct_2.exe перед рекомпиляцией.
Не помогает.
tolstopuz в сообщении #1601653 писал(а):
Может быть, вы ее 7 лет не обновляли, а может быть, даже 7 лет назад взяли не самую свежую.
Может быть. Но, по-моему, тут неувязка слишком вопиющая даже для ранней версии (если в этом дело).

Итак, я понял следующее. Код правильный, а не работает потому, что в системе компьютер + ОС + компилятор что-то не то. Может, вирус или типа того. Решать этот вопрос долго, и лучше я буду вообще без структур обходиться. Не такое уж большое неудобство. Всю жизнь обходился, и дальше не помру.

Пошел, однако, альтернативным путем, через передачу адреса, вот так:
Код:
#include <stdio.h>

struct vect { int x; int y;};

void sum_vect(struct vect, struct vect, struct vect *);

void sum_vect(struct vect vect1, struct vect vect2, struct vect *vect3)
{
   (*vect3).x=vect1.x+vect2.x;
   (*vect3).y=vect1.y+vect2.y;
   return;
}


main()
{
   struct vect vect1, vect2, vect3;
   vect1.x=1; vect1.y=2; vect2.x=3; vect2.y=4;
   sum_vect(vect1,vect2, &vect3);

   printf("vect3.x=%d,    vect3.y=%d\n", vect3.x, vect3.y);
  return 0;
}

И таки работает.

В общем, спасибо всем участвовавшим. Вопрос можно считать исчерпанным.

 Профиль  
                  
 
 Re: Возврат структуры из функции
Сообщение19.07.2023, 18:33 
Аватара пользователя


27/07/16
556
Была бурная дискуссия на такую тему (на сайте с говорящим по теме названием))
https://stackoverflow.com/questions/965 ... ction-in-c

 Профиль  
                  
 
 Re: Возврат структуры из функции
Сообщение19.07.2023, 20:36 
Заслуженный участник


31/12/05
1480
vpb в сообщении #1601663 писал(а):
Может быть. Но, по-моему, тут неувязка слишком вопиющая даже для ранней версии (если в этом дело).
Ну а все-таки, какая у вас версия?

 Профиль  
                  
 
 Re: Возврат структуры из функции
Сообщение19.07.2023, 21:07 
Заслуженный участник
Аватара пользователя


01/09/13
4320
Тут, знаете, "правило тринадцатого удара" - я бы сменил компилятор...

 Профиль  
                  
 
 Re: Возврат структуры из функции
Сообщение20.07.2023, 01:43 
Заслуженный участник


31/12/05
1480
vpb в сообщении #1601663 писал(а):
Но, по-моему, тут неувязка слишком вопиющая даже для ранней версии (если в этом дело).
Я проверил: версия 0.9.26-win64 от 2013-02-15 печатает "2 0" и подвисает, а версия 0.9.27-win64 от 2017-12-17 правильно печатает "4 6".

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

 Профиль  
                  
 
 Re: Возврат структуры из функции
Сообщение20.07.2023, 07:42 


18/09/21
1683
tolstopuz в сообщении #1601717 писал(а):
Я не представляю, как после этого можно доверять результатам программ, скомпилированных этим компилятором.
Ну так используйте какой-то компилятор с репутацией.
Например gcc (под windows можно в виде MinGW).

 Профиль  
                  
 
 Re: Возврат структуры из функции
Сообщение21.07.2023, 21:42 
Аватара пользователя


28/10/21
99
Genaa в сообщении #1601668 писал(а):
Была бурная дискуссия на такую тему (на сайте с говорящим по теме названием))
https://stackoverflow.com/questions/965 ... ction-in-c


Где там "бурная дискуссия"??? Ответ у всех один: "никакой проблемы здесь нет". И никто не возражает. Это "бурная дискуссия"?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 65 ]  На страницу 1, 2, 3, 4, 5  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group