Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.01.2014, 21:58   #1
Семижон Евгения
 
Регистрация: 19.01.2014
Сообщений: 6
По умолчанию Ошибка в коде программы (для индекса требуется массив или указатель). Язык Си

Подскажите, пожалуйста как исправить ошибку и из-за чего она возникла. Заранее благодарю.
Код:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#define N 3                                 //Количество предметов

struct A
{
	char aFIO[50];
	int aNO;
	float aUSP;
	char aPREDM[N][50];
};

struct B
{
	char bFIO[50];
	int bNO;
	float bUSP[N];
	char bPREDM[N][50];
};

A *poisk(A *a, int n, char *FIO);
B *poisk(B *b, int n, float *USP);

void main(void)
{
	A *a, *a2;
	B *b, *b2;
	int n, aNO, bNO;
	char aFIO[50], bFIO[50], aPREDM[N][50], bPREDM[N][50];
	float aUSP[N], bUSP[N];
	
	printf("\n Vedite kolichestvo studentov\n");
	scanf("%d", &n);
	a=(A*)calloc(n,sizeof(A));
	b=(B*)calloc(n,sizeof(B));
	for(int i=0; i<n; i++)
	{
		printf("\n Vvedite FIO studenta\n");
		fflush(stdin);
		gets(a[i].aFIO);
		gets(b[i].bFIO);
		printf("\n Vvedite # gruppy\n");
		fflush(stdin);
		scanf("%d", a[i].aNO);
		scanf("%d", b[i].bNO);
		for(int j=0; j<N; j++)
		{
			printf("\n Vvedite nazvanie predmeta %s\n", j+1);
			fflush(stdin);
			gets(a[i].aPREDM[N]);
			gets(b[i].bPREDM[N]);
			printf("\n Vvedite ocenku\n");
			fflush(stdin);
			scanf("%d", a[i].aUSP[N]);
			scanf("%d", b[i].bUSP[N]);
		}
	}
	
	A abuf;                                           //Сортировка
	for(int i=0; i < n; i++)
	{
		for(int j=i; j < n; j++)
		{
			if (a[i].aFIO > a[j].aFIO)
			{
				abuf=a[i];
				a[i]=a[j];
				a[j]=abuf;
			}
		}
	}

	B bbuf;
	for(int i=0; i < n; i++)
	{
		for(int j=i; j < n; j++)
		{
			if (b[i].bUSP > b[j].bUSP)
			{
				bbuf=b[i];
				b[i]=b[j];
				b[j]=bbuf;
			}
		}
	}

	printf("\tFIO\tGruppa\tPredmet\tUspevaemost\n");
	for(int i=0; i<n; i++)
	{
		printf("\t%s\t%d\t%s\t%d\n", a[i].aFIO, a[i].aNO, a[i].aPREDM, a[i].aUSP);
		puts("-------------------------------------------------------------------------------");
	}

	printf("\nVedite FIO studenta\n");
	fflush(stdin);
	gets(aFIO);
	printf("\nVvedite uspevaemost\n");
	scanf("%d",&bUSP);
	a2=poisk(a, n, aFIO);
	b2=poisk(b, n, bUSP);
}

A * a2(A *a, int n, char * aFIO2)
{
	A *a2;
	int ch=0;
	a2=(A*)calloc(n,sizeof(A));
	for(int i=0; i<n; i++)
	{
		if(strcmp(a[i].aFIO, aFIO2)==0)
		{
			a2[ch]=a[i];
			ch++;
		}
	}
	printf("\tFIO\tGruppa\tPredmety\tUspevaemost\n");
	for(int i=0; i<ch; i++)
	{
		for(int j=0; j<N; j++)
		printf("\t%s\t%d\t%s\t%d\n", a2[i].aFIO, a2[i].aNO, a2[i].aPREDM[N], a2[i].aUSP[N]);
		puts("-------------------------------------------------------------------------------");
	}
	return a2;
}

B * b2(B *b, int n, float * bUSP2)
{
	B *b2;
	int ch=0;
	b2=(B*)calloc(n,sizeof(B));
	for(int i=0; i<n; i++)
	{
		if(b[i].bUSP==bUSP2)
		{
			b2[ch]=b[i];
			ch++;
		}
	}
	printf("\tFIO\tGruppa\tPredmety\tUspevaemost\n");
	for(int i=0; i<ch; i++)
	{
		for(int j=0; j<N; j++)
		printf("\t%s\t%d\t%s\t%d\n", b2[i].bFIO, b2[i].bNO, b2[i].bPREDM[N], b2[i].bUSP[N]);
		puts("-------------------------------------------------------------------------------");
	}
	return b2;
}
Семижон Евгения вне форума Ответить с цитированием
Старый 19.01.2014, 23:24   #2
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

А в каком месте программы возникает ошибка? Какое сообщение отображается при ошибке?
Если это ошибка C2109, то подробности можно посмотреть здесь.
Используйте возможности среды разработки в которой работаете. Если она позволяет запустить программу по точкам останова, то двигаясь от точки останова "по шагам", можно найти "проблемный" оператор. Тогда будет проще узнать и причину ошибки.
Streletz вне форума Ответить с цитированием
Старый 19.01.2014, 23:47   #3
Семижон Евгения
 
Регистрация: 19.01.2014
Сообщений: 6
По умолчанию

Да, ошибка 2109, вот тут:
Код:
printf("\n Vvedite nazvanie predmeta %s\n", j+1);
			fflush(stdin);
			gets(a[i].aPREDM[N]);
			gets(b[i].bPREDM[N]);
			printf("\n Vvedite ocenku\n");
			fflush(stdin);
			scanf("%d", a[i].aUSP[N]);
			scanf("%d", b[i].bUSP[N]);
в строке scanf("%d", a[i].aUSP[N]);
И тут:
Код:
printf("\tFIO\tGruppa\tPredmety\tUspevaemost\n");
	for(int i=0; i<ch; i++)
	{
		for(int j=0; j<N; j++)
		printf("\t%s\t%d\t%s\t%d\n", a2[i].aFIO, a2[i].aNO, a2[i].aPREDM[N], a2[i].aUSP[N]);
		puts("-------------------------------------------------------------------------------");
	}
	return a2;
в строке printf("\t%s\t%d\t%s\t%d\n", a2[i].aFIO, a2[i].aNO, a2[i].aPREDM[N], a2[i].aUSP[N]);

Но я не могу сама разобраться как исправить, уж вроде все пробовала
Семижон Евгения вне форума Ответить с цитированием
Старый 19.01.2014, 23:53   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

У Вас в структуре A объявлено float aUSP;, т.е. это одна переменная, Вы же пытаетесь обратиться к ней, как к массиву a[i].aUSP[N]. Кстати, скорее всего, не N, а j нужно писать в этих циклах (например, b[i].bPREDM[j]).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 20.01.2014, 01:43   #5
Семижон Евгения
 
Регистрация: 19.01.2014
Сообщений: 6
По умолчанию

Спасибо, действительно проблема была в этом, но теперь кампиллятор не находит ошибок, а при построении выдает:
Ошибка 1 error LNK2019: ссылка на неразрешенный внешний символ "struct B * __cdecl poisk(struct B *,int,float *)" (?poisk@@YAPAUB@@PAU1@HPAM@Z) в функции _main
Ошибка 2 error LNK2019: ссылка на неразрешенный внешний символ "struct A * __cdecl poisk(struct A *,int,char *)" (?poisk@@YAPAUA@@PAU1@HPAD@Z) в функции _main
Ошибка 3 error LNK1120: 2 неразрешенных внешних элементов
Семижон Евгения вне форума Ответить с цитированием
Старый 20.01.2014, 02:13   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Скорее всего, неправильная типизация при обращении к структурам. В коде разбираться не стал,спать хочу. Но проблема по-моему в этом.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 20.01.2014, 02:40   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Ну так объявлена функция poisk, а реализованы функции с именами a2 и b2.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 20.01.2014, 02:45   #8
Семижон Евгения
 
Регистрация: 19.01.2014
Сообщений: 6
По умолчанию

Точно! Спасибо огромное, Вы мне очень помогли!
Семижон Евгения вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в коде программы.Язык Си. East Undia Trading Помощь студентам 8 19.01.2014 21:03
Где ошибка в этом исходном коде на языке Си? Или ошибка в Excel? ArchiCurtis Помощь студентам 2 07.04.2012 14:16
Ошибка в коде программы VB Мина Помощь студентам 1 02.12.2011 06:54
Ошибка в коде, ошибка в css или это проблема с совместимостью с браузерами? ankris HTML и CSS 5 23.11.2010 16:58
Ошибка в коде или что-то другое? Яр|/||< (^_^) PHP 17 17.06.2010 18:10