struct --> array --> pointer

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
SeriK00
Beiträge: 34
Registriert: Fr Mai 15, 2009 12:15 pm

struct --> array --> pointer

Beitrag von SeriK00 » Sa Jun 06, 2009 12:17 pm

Hallo Leute,
ich habe folgendes Problem:
Es werden drei elemente nacheinander in array eingelesen und in die struct person eingefügt.
In der Funktion: void array_schreiben(char *pointer, person pers) will ich alle drei Elemente auf die adresse von pointer schreiben (pointer verweist ja auf array).
Hinterher soll sowas rauskommen: (100NameVorname).

Also ich schreibe ID und erhöhe den Pointer um Größe von ID usw.
Das klappt leider nicht.
Ich weiß, das man das Problem schlicht durch strcat lösen kann, ich will aber den Umgang mit Pointer erlernen.

vielen Dank im Voraus.

Code: Alles auswählen

#include "stdafx.h"
#define SIZE 10

typedef struct person
{
	int id;
	char vorname [SIZE];
	char nachname [SIZE];
};

void array_schreiben(char *pointer, person pers);

char array[100];

int _tmain(int argc, _TCHAR* argv[])
{

	person pers;

	puts("\nBitte ID eingeben: ");
	gets(array);
	pers.id = atoi(array);
	printf("\n%d", pers.id);
	
	puts("\nBitte VORNAME eingeben :");
	gets(array);
	strcpy(pers.vorname, array);
	puts(pers.vorname);

	puts("\nBitte NACHNAME eingeben :");
	gets(array);
	strcpy(pers.nachname, array);
	puts(pers.nachname);

	array_schreiben(array, pers); //array ist ein Zeiger auf ein char array

	return 0;
}

void array_schreiben(char *pointer, person pers)
{
	char ram[4];
	itoa(pers.id, ram, 10);
	strcpy(pointer, ram);
	pointer+=pointer+sizeof(pers.id);		//pointer um die größe des Elements pers.id erhöhen
	
	strcpy(pointer, pers.vorname);			//pointe muss eingentlich auf die 1. Adresse anch pers.id zeigen tut er aber nicht
	printf("\n Adresse vom pointer %p", pointer);
	pointer+=sizeof(pers.vorname);			//pointer um die größe des Elements pers.vorname erhöhen	

	strcpy(pointer, pers.nachname);
	pointer+=sizeof(pers.nachname);

	printf("\n%s", array);                                   
	printf("\n%s", pointer);                        //Hier sollen alle drei Eingaben hintereinander stehen
}
Windows XP Prof
Visual Studion 2005
Keil µVision 3

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: struct --> array --> pointer

Beitrag von Dirty Oerti » Sa Jun 06, 2009 12:29 pm

Dein Problem liegt beim sizeof, würde ich mal sagen :)
sizeof gibt dir die Größe an, die dein "Objekt", was du ihm gibst, in Byte hat.

Gibst du also einen Integer (Pers.Id) an, dann wirst du als "Antwort" 4 Byte bekommen, denn so groß ist nunmal ein Integer.
Du willst aber die "Länge des Strings", den dieser Integer ergibt. Dazu benutzt du str_lenght (oder so ähnlich).
Und zwar benutzt du diese Funktion nicht mit deinem Integer, sondern mit dem Char-String (in dem Fall "ram").

Genauso solltest du es auch bei den anderen Elementen von Pers machen, da es sich ja immer um einen String handelt.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: struct --> array --> pointer

Beitrag von cloidnerux » Sa Jun 06, 2009 1:10 pm

Was mir ncoh aufgefallen ist: Du hast sehr kleine größen für diene Arrays z.B im Struct.
Sobald jemand mehr als 10 Buchstaben eingibt, läuft der Array über und Fehler.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: struct --> array --> pointer

Beitrag von Kerli » Sa Jun 06, 2009 2:24 pm

SeriK00 hat geschrieben: pointer+=pointer+sizeof(pers.id); //pointer um die größe des Elements pers.id erhöhen
Irgendwas passt da wohl nicht, oder? Überleg doch einmal was denn der '+='-Operator macht... ;)
Dirty Oerti hat geschrieben:Du willst aber die "Länge des Strings", den dieser Integer ergibt. Dazu benutzt du str_lenght (oder so ähnlich).
Genau, nur das die Funktion strlen heißt: http://tutorial.proggen.org/doku.php?id ... ing:strlen
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

SeriK00
Beiträge: 34
Registriert: Fr Mai 15, 2009 12:15 pm

Re: struct --> array --> pointer

Beitrag von SeriK00 » So Jun 07, 2009 3:35 pm

Hallo und Vielen Dank,
pointer+=pointer+sizeof(pers.id);
Mit deisem Befeht wollte ich den pointer um die Größe von int, also vier erhöhen.
Stimmt das den nicht?

Ich benutze jetzt strlen, das klappt so weit ganz gut.
Allerdings möchte ich eine Leerstelle zwischen Elementen einfügen.
Warum klappt das nicht?


Code: Alles auswählen

#include "stdafx.h"

#define SIZE 100

void array_schreiben(char *pointer, person pers);
char array[SIZE];

int _tmain(int argc, _TCHAR* argv[])
{

	person pers;

	puts("\nBitte ID eingeben: ");
	gets(array);
	pers.id = atoi(array);
	printf("%d", pers.id);
	
	puts("\nBitte VORNAME eingeben :");
	gets(array);
	strcpy(pers.vorname, array);
	puts(pers.vorname);

	puts("\nBitte NACHNAME eingeben :");
	gets(array);
	strcpy(pers.nachname, array);
	puts(pers.nachname);

	array_schreiben(array, pers);					//array ist ein Zeiger auf ein char array

	return 0;
}

void array_schreiben(char *pointer, person pers)
{
	int a,b,c;
	char ram[4];
	itoa(pers.id, ram, 10);
	strcpy(pointer, ram);
	a = strlen(ram);
	printf("\npointer von a vor :%p", pointer);
	pointer+=strlen(ram)+1;
	printf("\npointer von a nach :%p", pointer);
	
	strcpy(pointer, pers.vorname);			
	b = strlen(pers.vorname);			
	printf("\npointer von a vor :%p", pointer);
	pointer+=strlen(pers.vorname)+1;
	printf("\npointer von a nach :%p", pointer);

	strcpy(pointer, pers.nachname);
	c = strlen(pers.nachname);
	printf("\nointer von a nach :%p", pointer);
	pointer+=strlen(pers.nachname)+1;
	printf("\npointer von a nach :%p", pointer);

	printf("\na=%d,b=%d,c=%d", a,b,c);
	printf("\n%s", array);
}
Windows XP Prof
Visual Studion 2005
Keil µVision 3

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: struct --> array --> pointer

Beitrag von Kerli » So Jun 07, 2009 6:46 pm

SeriK00 hat geschrieben:pointer+=pointer+sizeof(pers.id);
Mit deisem Befeht wollte ich den pointer um die Größe von int, also vier erhöhen.
Stimmt das den nicht?
Nein stimmt nicht :) Du erhöhst den Wert von pointer nämlich um den eigenen Wert und die Grö0e von int...
Also entweder du schreibst

Code: Alles auswählen

pointer += sizeof(pers.id);
oder

Code: Alles auswählen

pointer = pointer + sizeof(pers.id)
Wobei die erste Möglichkeit natürlich zu bevorzugen ist, da ja für genau so etwas der += Operator definiert wurde. Was ich gesehen hab hast du das im aktuellen Code aber eh nicht mehr drinnen.
SeriK00 hat geschrieben:Allerdings möchte ich eine Leerstelle zwischen Elementen einfügen.
Warum klappt das nicht?
Du solltest sie auch ins Array schreiben ;) Also an die entsprechenden Stellen ein Leerzeichen reinschreiben. zb so:

Code: Alles auswählen

pointer+=strlen(ram);
*pointer = ' '; // Leerzeichen schreiben
++pointer; // und Zeiger weiterbewegen
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Antworten