Dynamiczna alokacja pamięci dla tablic i struktur

0

Witam, ciągle sobie ulepszam swój program i mam problem z alokacją pamięci. Przy alokacji tablicy wyskakuje seria błędów, a dla struktur wgl nie wiem jak to zrobić.

 //============================================================================
// Name        : Przyjaciele.cpp
// Author      :
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <sstream>
#include <conio.h>
#include<stdio.h>
using namespace std;







int main(int argc, char *argv[]) {
	int dlugosc;
	FILE* plik;
	char *n;
	char* xx;
	int rozmiar;
	dlugosc=0;
	xx = (char*) malloc(100*sizeof(char));
	plik = fopen (argv[1],"r");
/////////////ilosc lini///////////
	while (feof(plik) == false) {
		fgets( xx, 100, plik );
		dlugosc=dlugosc+1;
	}
/////////////

fclose(plik);

		cout << "Rozmiar:"
				<< dlugosc;

	struct dane {
		char* imie;
		int wiek;
		char* przyjaciele[99];
		int ile_przyjaciol;
		char* wrogowie[99];
		int ile_wrogow;
		string lancuch[99];
	};
	struct dane osoby[1000];

	int w, j, x, i,z,m;
	string lancuch;
	char* po;
	char*po2;
	char* tab= malloc(dlugosc*sizeof(char));      // TU JEST BLAD





	char* imie_max;
	int bonus, max, suma, l_osoby;
	float srednia, licznik;

	char* tekst;
	tekst = (char*) malloc(100*sizeof(char));


	z = 0;
	l_osoby = 0;
	j = 0;
	plik = fopen(argv[1], "r");
	while (feof(plik) == false) {
		i = 0;

		n = fgets(tekst, 100, plik);
		///printf("%s\n",tekst);

		char* k = tekst;
		while (k != NULL) {
			char* l = strchr(k + 1, '	');
			if (l != NULL)
				*l = '\0';

			////cout << k << endl;

			bonus = strlen(k);

			if (k[bonus - 1] == '\n')
				k[bonus - 1] = '\0';

			tab[i] = k;

			i = i + 1;
			if (l != NULL)
				k = l + 1;
			else
				k = NULL;
		}
////////////osoby////////////////
		if (strlen(tab[0]) == 5) {
			l_osoby = l_osoby + 1;
			osoby[j].imie = strdup(tab[1]);
			osoby[j].wiek = atof(tab[2]);
			///	printf("%d\n",j);
			///	printf("imie %s\n",osoby[j].imie);
			////printf("wiek %d\n",osoby[j].wiek);
			////printf("\n");
		}
		///////////////////////////////////
if (l_osoby==0){
	printf("ILOSC: 0");
	return EXIT_SUCCESS;
}
		/////////////////przyjaciele/////////////////////
		if (strlen(tab[0]) == 11) {
			z = z + 1;
			///printf("%s\n",tab[0]);
			for (i = 0; i <= j - z; i++) {
				w = 0;

//////////PRZYJACIELE////////////////////
				if (osoby[i].imie == string(tab[1])) {

					while (osoby[i].przyjaciele[w] != NULL) {
						w = w + 1;
					}

					osoby[i].przyjaciele[w] = strdup(tab[2]);
					osoby[i].ile_przyjaciol = w + 1;
				}

				if (osoby[i].imie == string(tab[2])) {

					while (osoby[i].przyjaciele[w] != NULL) {
						w = w + 1;
					}
					osoby[i].przyjaciele[w] = strdup(tab[1]);
					osoby[i].ile_przyjaciol = w + 1;
				}
			}

		}

		/////////////////////////WROGOWIE/////////////////////
		if (strlen(tab[0]) == 8) {
			z = z + 1;
			///printf("%s\n",tab[0]);
			for (i = 0; i <= j - z; i++) {
				w = 0;
				if (osoby[i].imie == string(tab[1])) {

					while (osoby[i].wrogowie[w] != NULL) {
						w = w + 1;
					}

					osoby[i].wrogowie[w] = strdup(tab[2]);
					osoby[i].ile_wrogow = w + 1;
				}

				if (osoby[i].imie == string(tab[2])) {

					while (osoby[i].wrogowie[w] != NULL) {
						w = w + 1;
					}
					osoby[i].wrogowie[w] = strdup(tab[1]);
					osoby[i].ile_wrogow = w + 1;
				}
			}

		}
		///////////////////////////////////////////

		j = j + 1;
	}





	////////////////lancuch///////////////////////
	////printf("odpalanie lancucha\n");



	for (i=0;i<=j-z;i++){
		for (w=0;w<=osoby[i].ile_przyjaciol-1;w++){
			for (x=0;x<=j-z;x++){
				for(m=0;m<=osoby[i].ile_wrogow-1;m++){
					if (string(osoby[i].przyjaciele[w])==string(osoby[i].wrogowie[m])){
						return EXIT_FAILURE;
					}

				}
			}
		}

	}


////zadania programu///////////////

////najwiecej przyjaciol///////////
	max = 0;
	for (i = 0; i <= j - 1; i++) {
		if (osoby[i].ile_przyjaciol >= max) {
			max = osoby[i].ile_przyjaciol;
			imie_max = osoby[i].imie;
		}

	}
	if (max == 0) {
		printf("NAJWIECEJ_PRZYJACIOL: brak\n");
	} else {
		printf("NAJWIECEJ_PRZYJACIOL: %s\n", imie_max);
	}
/////////////////////////
	////najwiecej wrogow///////////
	max = 0;
	for (i = 0; i <= j - 1; i++) {
		if (osoby[i].ile_wrogow >= max) {
			max = osoby[i].ile_wrogow;
			imie_max = osoby[i].imie;
		}

	}
	if (max == 0) {
		printf("NAJWIECEJ_WROGOW: brak\n");
	} else {
		printf("NAJWIECEJ_WROGOW: %s\n", imie_max);
	}
	/////////////////////////
//////sredni wiek bez przyjaciol////////////
	licznik = 0;
	suma = 0;
	srednia = 0;
	for (i = 0; i <= j - 1; i++) {
		if ((osoby[i].ile_przyjaciol == 0) && (osoby[i].imie != NULL)) {
			suma = suma + osoby[i].wiek;

			licznik = licznik + 1;
		}

	}
	srednia = suma / licznik;
	printf("SREDNI_WIEK_BEZ_PRZYJACIOL: %.1lf\n", srednia);
	printf("ILOSC: %d\n", l_osoby);


	for(i=0;i<=10;i++){
			for (j=0;j<=10;j++){
			////	cout<<"lancuch: "<<osoby[i].lancuch[j]<<endl;
				//printf ("zmienna dodatkowa: %d i %s oraz %s\n",m,po,po2);
			}
		}





	return EXIT_SUCCESS;
}

Oto mój kod, zaznaczyłem gdzie jest błąd,a zmienna długość oznacza ilość wierszy w pliku. Z góry dziękuję i pozdrawiam.

1

ten kod wygląda jak cały jeden wielki błąd.

  • używasz c++ korzystaj z operatora new
  • formatuj kod
  • zapoznaj się z funkcjami. Jeżeli musisz pisać komentarze to zapewne tam może być stworzona funkcja z odpowiednią nazwą
  • nazywaj zmienne tak by coś mówiły
  • korzystaj z dobrodziejstw c++ a nie z c skoro robisz w c++

edit a jak bardzo chcesz pozostać przy tym kodzie to musisz rzutować na char. malloc zwraca wskaźnik na void

1 użytkowników online, w tym zalogowanych: 0, gości: 1