2014 dxdy logo

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

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




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


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

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

Код:
#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
4332
Кстати да, а как запускается программа?

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


16/07/14
8584
Цюрих
Чем компилируется, как запускается, в чем именно "сбой"?
Просто код
Используется синтаксис 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
3118
Спасибо за ответы.
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
8584
Цюрих
Попробуйте в начало main печать еще чего-нибудь добавить - нормально напечатает? И удалите на всякий случай upr_struct_2.exe перед рекомпиляцией.
Выглядит очень странно, код правильный, ощущение что запускается не он.

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


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

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


18/01/15
3118
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
1483
vpb в сообщении #1601663 писал(а):
Может быть. Но, по-моему, тут неувязка слишком вопиющая даже для ранней версии (если в этом дело).
Ну а все-таки, какая у вас версия?

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


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

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


31/12/05
1483
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
1686
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, Супермодераторы



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

Сейчас этот форум просматривают: Missir


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

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