C - struktura ve struktuře výpis – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

C - struktura ve struktuře výpis – C / C++ – Fórum – Programujte.comC - struktura ve struktuře výpis – C / C++ – Fórum – Programujte.com

 

zuufku0
Duch
24. 1. 2012   #1
-
0
-

Dobrý den ,

chtěl jsem se zeptat na takový pro Vás asi stupidní dotaz.

Mám tento kód (dělal jsem ho sám, takže nevím jestli je vhodně/dobře napsaný):

ucet.h 

#pragma once
#include <stdio.h>
#include <stdlib.h>


typedef struct ucet{
    int id;
    int zustatek;
}tUcet;


tUcet *vytvorUcet(int id, int zustatek);
void vypisUcet(tUcet *ucet);

ucet.c

#include "ucet.h"
#include <stdio.h>
#include <stdlib.h>

tUcet *vytvorUcet(int id, int zustatek){
    tUcet *ucet;
    ucet = (tUcet *)malloc(sizeof(tUcet));
    ucet->id = id;
    ucet->zustatek = zustatek;
    return ucet;
}

void vypisUcet(tUcet *ucet){
    printf("id = %d\n", ucet->id);
    printf("zustatek = %d\n", ucet->zustatek );
    printf("____________!!___________\n");
}

poleOsoba.h (jen důležitý kód)

typedef struct osoba{
	char jm[20];
	char pr[20];
	tUcet *ucet;
}tOsoba;

poleOsoba.c (jen důležitý kód)

void vypis(tOsoba *osoba){
	int j;
	
	for (j=0; j<i; j++){
		printf("JMENO = %s\n",osoba[j].jm);
		printf("PRIJMENI = %s\n", osoba[j].pr);
		vypisUcet(???????????);
	}
}

nyní bych potřeboval místo otazníků vypsat metodou vypisUcet  účet náležící osobě na [j]. Bohužel se mi to přes všemožné zkoušení dosud nepodařilo. poleOsoba.c a poleOsoba.h má samozřejmě přidělen náležitý #include či #pragma once.

Tímto způsobem Vás tedy prosím o pomoc    .

Program je psán v C (ne v C++).

Za odpovědi předem děkuji.

Nahlásit jako SPAM
IP: 109.73.212.–
m->29+6
Super člen
24. 1. 2012   #2
-
+1
-
Zajímavé

Myslým, že osoba[j].ucet by malo fungovať. Otázka je, či dobre plníš to pole ak nefunguje. Akú chybu ti to napíše?

Nahlásit jako SPAM
IP: 83.240.51.–
zuufku0
Duch
24. 1. 2012   #3
-
0
-

 chyba = vyskočí tabulka s break a continue a hláška:

Unhandled exception at 0x011b14f3 in priprava_zk_cv1.exe: 0xC0000005: Access violation reading location 0xfdfdfdfd.

+ žlutá šipka na     printf("id = %d\n", ucet->id);  v metodě vypisUcet v ucet.c

přidávám zbytek tříd (kdyby jste to chtěl vyzkoušet u sebe) 

poleOsoba.h 

#pragma once
#include "ucet.h"
#include <stdio.h>
#include <stdlib.h>

typedef struct osoba{
	char jm[20];
	char pr[20];
	 tUcet *ucet;
}tOsoba;

tOsoba *nactiPoleOS();
void vypis(tOsoba *osoba);

poleOsoba.c

#include "poleOsob.h"
#include <stdlib.h>
#include <stdio.h>

int i;

tOsoba *nactiPoleOS(){
	tOsoba *osoba, *prvni = NULL;
	FILE *fr;
		
	fr = fopen("osoby.txt","r");
	while(feof(fr) == 0){
	osoba = (tOsoba*) malloc(sizeof(tOsoba));
	osoba->ucet = NULL;
	fscanf(fr,"%s",&osoba->jm);
	fscanf(fr,"%s",&osoba->pr);
	i++;
	osoba->ucet = vytvorUcet((int)rand()%10 +1 ,(int)rand()%1000 +1);

	if (prvni == NULL){
		prvni = osoba;
		}

	}

	osoba = prvni;
	return osoba;
}


void vypis(tOsoba *osoba){
	int j;
	tUcet *ucet;
	
	for (j=0; j<i; j++){
		ucet = osoba[i].ucet;
		printf("JMENO = %s\n",osoba[j].jm);
		printf("PRIJMENI = %s\n", osoba[j].pr);
		vypisUcet(osoba[i].ucet);
	}
}

hlavniProgram.c

#include "poleOsob.h"
#include "ucet.h"
#include <stdlib.h>
#include <stdio.h>



void main (void){
	tOsoba *osoba;

	osoba = nactiPoleOS();
	vypis(osoba);
	system("pause");
}

třídy ucet.c a ucet.h jsou kompletní už v prvním příspěvku .

Nahlásit jako SPAM
IP: 109.73.212.–
m->29+6
Super člen
24. 1. 2012   #4
-
0
-

Na riadku osoba = (tOsoba*) malloc(sizeof(tOsoba)); si prepisuješ premennú osoba tak, že v nej po skončení cyklu zostane len posledná osoba. Navyše tam vzniká únik pamäte.

Pole osôb sa alokuje úplne inak.  

tOsoba *osoby = (tOsoba*) malloc(pocetOsob*sizeof(tOsoba));

while(feof(fr) == 0) {
  fscanf(fr, "%s", osoby[i].jm);
  fscanf(fr, "%s", osoby[i].pr);
  osoby[i].ucet = vytvorUcet((int)rand()%10 +1 ,(int)rand()%1000 +1);

  i++;

  if(prvni == NULL){
    prvni = osoby;
  }
}

Nahlásit jako SPAM
IP: 83.240.51.–
zuufku0
Duch
25. 1. 2012   #5
-
0
-

Super díky moc už to šlape.   

Nahlásit jako SPAM
IP: 109.73.212.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 22 hostů

Podobná vlákna

Retazec v strukture — založil michal

Ukazatel ve strukture — založil Hlavinka

Soubor ve struktuře — založil Jan

Dynamicky clen v strukture — založil Zajcev

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý