Поэтому я тщательно изучил темы, выполнив поиск по этому сайту, но не смог найти то, что могло бы мне помочь.
Я делаю задание для своего друга и позвольте мне сказать вам, что прошел год или больше с тех пор, как я использовал C ++.
Поэтому проблема, с которой я сталкиваюсь, связана с указателями и возвращением структуры через указатель.
Вот код ниже:
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
struct student
{
int SUB[3];
};
struct AVGPCT
{
float avg;
float pct;
};AVGPCT* CALC(student *A)
{
int x,y;
AVGPCT D[5]={0.0,0.0,0.0,0.0,0.0};
for(x=0;x<5;x++)
{
for(y=0;y<3;y++)
{
D[x].avg+=A[x].SUB[y];
D[x].pct+=A[x].SUB[y];
}
}
for(x=0;x<5;x++)
{
D[x].avg/=2;
D[x].pct/=300;
}
return (D);
}
void main(void)
{
int i,j;
student S[5];
AVGPCT *V;
for(i=0;i<5;i++)
{
for(j=0;j<3;j++)
{
cout << "Enter Marks Of Subject[" << (j+1) << "] Of Student [" << (i+1) <<"] [Max=100]:";
cin >> S[i].SUB[j];
}
}
V = CALC(S);
cout << "Average Number Of Student [1]: " << V->avg;
cout << (*V).pct;
getch();
}
Теперь проблема в том, что мне трудно получить правильные значения из этого места.
Я пытаюсь увеличить указатель с помощью V ++. Самое смешное, что это правильно печатает значения, если я использую:
cout << V->avg;
cout << V->pct;
V++;
cout << V->avg;
cout << V->pct;
И так далее. Но если я использую цикл или записываю хотя бы одну строку, или использую endl или \ n, значения перемешиваются и появляются бессмысленные значения.
Так что здесь может пойти не так?
Важно, что я использую структуру, а также, пожалуйста, руководство в соответствии с кодом.
Выглядит как эта строка
AVGPCT D[5]={0.0,0.0,0.0,0.0,0.0};
объявляет массив D локально для функции CALC()
Вы передаете указатель на этот массив обратно в основную функцию, но массив помечается как бесплатная игра для перезаписи после завершения функции. Чем больше вещей вы делаете в программе, тем больше вероятность того, что это место в памяти будет перезаписано, хотя трудно сказать, когда это произойдет. Следовательно, иногда вам это сходит с рук, иногда нет.
С риском дать вам совет, вероятно, лучше объявить D
где-то в главном и передать указатель на него в функцию или использовать new
или же malloc
внутри функции и передайте результирующий указатель обратно.
Возврат указателя на данные в стеке не работает. Использовать std:vector<AVGPCT>
вместо этого и вернуть его по значению, а не по указателю. C ++, в отличие от Java или C #, основан на значениях, а не на указателях.
C ++ не позволяет возвращать void
от main()
,
Заголовок <iostream.h>
не существует в соответствии со стандартом C ++. Стандартный заголовок <iostream>
,