• Paranoid - курс по анонимности и безопасности в сети от команды codeby. Защита персональных данных, анонимность в сети интернет, настройка виртуальных машин, безопасная передача данных, анти форензика и еще много всего полезного. Подробнее ...

Заполнение массива в С и структуры

  • Автор темы misterio
  • Дата начала
M

misterio

#1
1)Вообщем постала у меня такая нелепая проблема во время перехода с Delphi на С++ - не могу заполнить целочисленный массив:

Код:
int mass[10];
int i;
...
for (i = 0; i<10; i++) {
scanf("%d", mass[i]);
}
В итоге имеем Access Violation. Где подвох?
И вообще как можно вместо того, чтобы писать (i < 10), написать, что-то типа... (i < /количества елеметнов mass/).

2)

Код:
struct man {
char name;
int phone;
} me;
...
me.phone = 123; //тут все ОК.
me.name = "Жека" // а вот тут возникает ошибка. Я написал так : strcpy(me.name,"Жека") - сработало, но есть ли другой споспоб?
 

shisik

Well-known member
26.08.2007
154
0
#2
1) Функция scanf принимает параметр типа указатель: scanf("%d", &mass); Хотя я бы написал scanf("%d", mass + i);
Размер массива можно узнать написав sizeof(mass) / sizeof(int);

2) Вместо char name; нужно указать char *name; (или char name[длина_строки]; ). В первом случае это будет лишь указатель на строку, а физически данные будут расположены в другом месте и если указатель ссылается на константу (как в данном случае), то строку нельзя будет изменять. Во втором случае будет выделена память под строку, но копировать можно только через strcpy или в цикле (strcpy фактически это и делает).
 
M

misterio

#4
Опять же еще 1 проблема :

Код:
...
#define num 4
...
void get_m (int *m[num])
{
register int i;

for(i = 0; i < num; i++)
scanf("%d", &m[i]);
}
...
int main (void)
{
int matrix[num];

get_m(&matrix[num]);

return 0;
}
Да..вроде бы все должно работать - передача параметра по ссылке, но после ввода 4 чисел - Access Violation.
 
G

gamecreator

#5
попробуй
Код:
void get_m (int m[num])
...
int main (void)
{
...
get_m(matrix);
...
}
 
M

misterio

#6
Это вроде в С++ так? A вопрос по C,а вообще суть в том, чтобы в удаленной функции заполнился массив matrix[num], который находиться в основной и не объявлен как глобальный!
 

shisik

Well-known member
26.08.2007
154
0
#7
Кто ж так массивы передаёт?
Код:
void get_m (int *m, int num)
{
register int i;

for(i = 0; i < num; i++)
scanf("%d", m + i);
}

int main (void)
{
int num = 4;

int *matrix = new int[num];

get_m(matrix, num);

delete [] matrix;

return 0;
}
Хотя вариант, предложенный gamecreator тоже будет работать. Но только если размер массива известен заранее...
 
M

misterio

#8
Кто ж так массивы передаёт?
Ну знаете...всю жизнь на Pascal..а тут на тебе столько работы с указателем.
А это можно записать так :
Код:
int *matrix[num];
и какая разница? У меня слово new ассоциируется с ActionScript.
 
M

misterio

#10
ActionScript - язык сценариев. Используеться в основном в Macromedia Flash. Я когда - то очень давно, там делал ДАРТС - пришлось подучить немного. <<-- ФЛУД.
 

shisik

Well-known member
26.08.2007
154
0
#11
А это можно записать так :
Код:
int *matrix[num];
и какая разница? У меня слово new ассоциируется с ActionScript.
Нет, это будет другое объявление. В первом случае выделяется память под определённое число элементов типа int, а у тебя под элементы типа указатель на int. Кроме того, new выделает память во время выполнения программы.
Моя запись равна int matrix[num];, только num должно быть константой...