Я создал программу периодической таблицы на C с динамическим полем, или, по крайней мере, я пытался.
Позже я дополню программу остальными 116 элементами, а пока будет вот так.
Компилятор ничего не говорит, но я получаю ошибку времени выполнения: «нарушение доступа к памяти»
Что я упустил/упустил?
Вывод должен отображать только сохраненные элементы (алюминий/радий).
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct
{
char Name[20];
char Symbol[3];
char Atomicnumber[5];
char* entrys;
} Element;
int main(void)
{
//Define the two entrys/elements
Element Aluminium;
strcpy(Aluminium.Name, "Aluminium");
strcpy(Aluminium.Symbol, "Al");
strcpy(Aluminium.Atomicnumber, "13");
Element Radium;
strcpy(Radium.Name, "Radium");
strcpy(Radium.Symbol, "Ra");
strcpy(Radium.Atomicnumber, "88");
int size=0;
//Define field
printf ("size of field:");
scanf( "%d" , &size);
//Gives the saved Elements an Adress in Array/Field
Element Periodictable [size];
strcpy(Periodictable[13].Name, "Aluminium");
strcpy(Periodictable[13].Symbol, "Al");
strcpy(Periodictable[13].Atomicnumber, "13");
strcpy(Periodictable[13].entrys, "1");
strcpy(Periodictable[88].Name, "Radium");
strcpy(Periodictable[88].Symbol, "Ra");
strcpy(Periodictable[88].Atomicnumber, "88");
strcpy(Periodictable[88].entrys, "1");
void output(Element* Periodictable, int*entry);
printf("Recorded elements:\n");
printf("\n");
for (int i=1; i<= size; i++)
{
if (Periodictable[i].entrys)
{
printf("Name: %s \n",Periodictable[i].Name);
printf("Symbol: %s \n",Periodictable[i].Symbol);
printf("Atomic number: %s \n",Periodictable[i].Atomicnumber);
printf("\n");
}
else i++;
}
return (0);
}
вывод должен быть таким:
Recorded elements:
Name: Aluminium
Symbol: Al
Atomic number: 13
Name: Radium
Symbol: Ra
Atomic number: 88
Определенное поле все еще должно быть создано, но пустые поля/адреса не должны отображаться в консоли.
entrys
— это указатель на символ без выделенной для него памяти. Поэтому эта строкаstrcpy(Periodictable[13].entrys, "1");
завершится ошибкой - person Ed Heal   schedule 06.02.2017char* entrys;
предназначен для указателя на строку, а не на память для строки. Вы хотитеchar entrys[4];
вместо этого? - person Richard Chambers   schedule 06.02.2017Ununseptium
иUnunoctium
... - person David C. Rankin   schedule 06.02.2017[size]
элементов в C должен быть от 0 до (размер-1). Цикл forfor(int i=1; i<= size; i++)
должен бытьfor(int i=0; i< size; i++)
. А в другом случаеelse i++;
скроет следующий элемент. - person J. Piquard   schedule 06.02.2017Element Periodictable [size];
равнымElement Periodictable [size] = {0};
, чтобы инициализировать его всеми нулями. Измените свой тест в цикле сif (Periodictable[i].entrys)
наif (Periodictable[i].entrys[0])
. Также исправьте управление внешним видом сfor (int i = 1; i <= size; i++)
наfor (int i = 0; i < size; i++)
. Я предполагаю, что ваш компилятор C допускает динамическое выделение массива с помощью массиваPeriodictable
. - person Richard Chambers   schedule 06.02.2017