C++ Von char to long ...

V

VirusDeluXe

Gast
Ich weis, dass es nun nicht unbedingt sauberes C++ ist, aber unsere Dozenten tun sich etwas schwer z.B. "cin" und "cout" zu verwenden ...

Ich habe ein ganz anderes grundsätzliches Problem. Hierbei handelt es sich um eine Konsolenanwendung. Was das Programm ausgibt, ist vermutlich nach einmaligem ausführen nahezu selbsterklärend.

Der Code macht zweimal das Gleiche. Einmal im "alten Stil", einmal eher in Richtung OOP. Dort ist in beiden Varianten ein Char-Array definiert. Wir sollen das ganze Umschreiben, so dass es ein long-Array verwendet. Ich tu mich allerdings mit dieser Umsetzung im Moment durchaus schwer und bin auch etwas mit meinem Rat am Ende.

Wenn ich die Anwendung starte, dann würde bei der Eingabe "5" im Char-Beispiel folgendes rauskommen:

A B C D

In der long-Variante müsste theoretisch rauskommen:

1 2 3 4

... Ich habe nun bewusst das Original reingepostet, weil egal wie ich den Quark ändere, ich komme immer nur auf Werte alá:

234789 234789 234789 234789 ...

Kann mir jemand evtl. einen Lösungsansatz geben bzw. es lösen, aber eine kleine Erklärung geben was er da genau geändert hat? Irgendwo habe ich gerade einen gigantischen Gedankenfehler.

Ich würde für jede Hilfe sehr danken.

Code:
#include <stdio.h>			// Standard-I/O-Bibliothek
#include <malloc.h>			// Speichermanagement-Bibliothek

int MemoryReservationException = 100;

int main()
{
	try
	{
        // Abfrage, wieviel Speicher reserviert werden soll.
		// Exception bei negativer oder ungültiger Eingabe.
		int request = 0;
        printf("Wieviel Speicher soll reserviert werden? ");
	    scanf("%d", &request);
		if (request <= 0) throw MemoryReservationException;

		// Dynamische Speicherallokation mit malloc(...).
		// Speicher wird mit Zeichen ab 'A' gefüllt.
        char *str1 = NULL;
        str1 = (char*)malloc(request);
        for (int i = 0; i < request; i++) str1[i] = char('A'+i);
        str1[request-1] = '\0';

		// Nach der Ausgabe auf stdin wird der Speicher wieder freigegeben.
        printf("\nAngelegte Zeichenkette: %s + \\0 \n", str1);
        free(str1); str1 = NULL;

	    printf("\n\nUnd jetzt dasselbe nochmal mit new & delete ...\n\n");
	
		// Dynamische Speicherallokation -- diesmal mit new.
		// Speicher wird mit Zeichen ab 'a' gefüllt.
        char *str2 = NULL;
        str2 = new char[request];
        for (int i = 0; i < request; i++) str2[i] = char('a'+i);
        str2[request-1] = '\0';

		// Nach der Ausgabe auf stdin wird der Speicher wieder freigegeben.
        printf("\nAngelegte Zeichenkette: %s + \\0 \n", str2);
        delete str2; str2 = NULL;	
	}
	catch (int e)
	{
		printf("\nUps, da ging was schief (Exception %d)...\n", e);
	}

    fflush(stdin); getchar();
	return 0;
}
 
Zuletzt bearbeitet:
Hi,

C++ kommt damit zurecht, wenn du char('A'+i) machst?
Muss man nicht normalerweise einen Ascii Wert von A zu Char konverten, auf den man addieren kann?
 
Ich weis nun nicht ob generell C++ damit klar kommt, allerdings kompiliere ich mit g++ unter Linux. Der scheint das zumindest sauber zu schlucken. Im VS habe ich es vor paar Minuten auch ausprobiert, weil ich die Hoffnung hatte, dass ich vllt durch eine Fehlermeldung auf die Lösung komme, allerdings ohne Erfolg. Das Studio in einer C++ Win32 Konsolenanwendung schluckt es aber auch ohne Probleme.

Die Vorlage ist auch nicht von mir. Ich persönlich würde normalerweise auf so einen Quark gar nicht kommen. Das ist das Original vom Dozenten. Meine Ausbildung habe ich in Java und C# gemacht, aber nun sitze ich im Studium und schlägere mich etwas mit den Eigenheiten von C/C++ herum. Die wollen mit solchen Beispielen ja immer tolle Dinge zeigen ... wenn man aber dann das Teil nicht in long bekommt ärgert man sich und das lässt mir gerade keine Ruhe :-/
 
Zuletzt bearbeitet:
Schlucken bedeutet, er meckert nicht rum oder da stehen die richtigen Werte drin?

Wie gesagt, versuchs mitm Chr(Asc('A')+i), vielleicht hilfts, oder ich habe einfach nicht verstanden, wo denn nun der Fehler liegt :)
 
Achso ... ne ne ^^ da ist eigentlich kein Fehler drin ... öhm ... wie sage ich es besser.

Da ist ja das char-Array. Er möchte im Prinzip das gleiche Programm so wie es ist, allerdings möchte er das Ganze mit dem Datentypen "long". Das 'a' würde rausfallen z.B., weil damit zählt er ja hoch. Das müsste dann mit einer 0 oder sowas ersetzt werden, damit er hochzählt ala "1", "2", "3", usw.

Ich bekomme es allerdings nicht mit einem long-Array realisiert, weil ich es meistens so weit schaffe, dass er zwar mir die passende Anzahl an Ausgaben gibt, allerdings die Werte sind komisch. Ich erwarte wie gesagt diese normalen Zahlen, erhalte allerdings immer so komische Werte wie "241567" usw. ... glaube der gibt bei mir Speicherbereiche oder irgendwas in die Richtung aus anstatt den Wert. Ist auch eine selten doofe Aufgabe und ein selten doofes Beispiel *lol* :)
 
Bei der Reservierung des Speichers mit malloc musst du aufpassen, dass du genügend Speicher reservierst. Für long solltest du also so etwas machen:
Code:
int iRequest = 5;
long* pLong = (long*)malloc( sizeof(long) * iRequest );

Außerdem darfst du bei der Zuweisung kein char mehr verwenden, sondern musst natürlich den Wert als long zuweisen. Also in etwa so:
Code:
for( int i=0; i<iRequest; ++i )
{
    pLong[i] = i+1;
}

Das sollte dein Problem lösen!

Gruß
BlackMark
 
Poste doch mal bitte dein auf long umgestelltes Programm. Du könntest theoretisch verschiedene Dinge falsch gemacht haben. Zeig uns einfach den Code und laß uns nicht länger herumrätseln. ;)
 
Im Moment schaut es wie nachfolgend aus, crasht allerdings bei der Eingabe. Habe den OOP Teil mit "new" mal auskommentiert und nicht verändert, weil der obige Teil einfach noch Theater macht ...

Code:
// Ko1.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//
#include "stdafx.h"

#include <stdio.h>			// Standard-I/O-Bibliothek
#include <malloc.h>			// Speichermanagement-Bibliothek

int MemoryReservationException = 100;

int main()
{
	try
	{
        // Abfrage, wieviel Speicher reserviert werden soll.
		// Exception bei negativer oder ungültiger Eingabe.
		int request = 0;
        printf("Wieviel Speicher soll reserviert werden? ");
	    scanf("%d", &request);
		if (request <= 0) throw MemoryReservationException;

		// Dynamische Speicherallokation mit malloc(...).
		// Speicher wird mit Zeichen ab 'A' gefüllt.
        long *str1 = NULL;
        *str1 = (long)malloc(sizeof(long) * request );
        for (long i = 0; i < request; i++) str1[i] = long(i+1);
        str1[request-1] = '\0';
		
		// Nach der Ausgabe auf stdin wird der Speicher wieder freigegeben.
        printf("\nAngelegte Zeichenkette: %d + \\0 \n", *str1);
        free(str1); str1 = NULL;

	    //printf("\n\nUnd jetzt dasselbe nochmal mit new & delete ...\n\n");
		//
		//// Dynamische Speicherallokation -- diesmal mit new.
		//// Speicher wird mit Zeichen ab 'a' gefüllt.
        //long *str2 = NULL;
        //str2 = new long[request];
        //for (int i = 0; i < request; i++) str2[i] = long(1+i);
        //str2[request-1] = 0;
		//
		//// Nach der Ausgabe auf stdin wird der Speicher wieder freigegeben.
        //printf("\nAngelegte Zeichenkette: %s + \\0 \n", sizeof(str2));
        //delete str2; str2 = NULL;	
	}
	catch (int e)
	{
		printf("\nUps, da ging was schief (Exception %d)...\n", e);
	}

    fflush(stdin); getchar();
	return 0;
}
 
Der Fehler liegt hier:
Code:
*str1 = (long)malloc(sizeof(long) * request );
Du versuchst str1 zu dereferenzieren obwohl str1=0 ist. Richtig wäre:
Code:
str1 = (long*)malloc(sizeof(long) * request );
Interessanterweise ist es in deinem ersten Beitrag ja richtig. Verstehe nicht, warum du es bei der Umstellung auf long dann verändert hast.
 
Sollte
Code:
printf("\nAngelegte Zeichenkette: %d + \\0 \n", *str1);
nicht auch eher so heißen:
Code:
printf("\nAngelegte Zeichenkette: %ld + \\0 \n", *str1);

printf gibt nämlich Quatsch aus, wenn der Parametertyp nicht passt.
 
Zeile 26 ist falsch, das solltest du nicht machen!

Du weist hier dem letzten Element des long-Arrays ein char zu, das kann natürlich nicht funktionieren! Einfach diese Zeile weglassen!

Die Ausgabe passt ebenfalls nicht, weil du ein long-Array nicht gleich wie ein char-Array ausgeben kannst! Also einfach eine Schleife und die Werte einzeln ausgeben!

Gruß
BlackMark
 
BlackMark schrieb:
Zeile 26 ist falsch, das solltest du nicht machen!

Du weist hier dem letzten Element des long-Arrays ein char zu, das kann natürlich nicht funktionieren! Einfach diese Zeile weglassen!

Ich schätze, er hat hier fälschlicherweise geglaubt, er müsse sein long-Array (genau wie vorher sein char-Array) mit einer terminierenden Null beglücken. Das muß er natürlich nicht, es schadet aber auch nichts, wenn er bereit ist, in Kauf zu nehmen, daß sein letztes Element mit einer Null überschrieben wird.
Ergänzung ()

Wichtig ist, daß der OP folgendes verstanden hat. Wenn du im printf() den Formatspezifizierer %s angibst, sagst du damit: "Liebes printf(), ich gebe dir hier die Adresse des ersten Elements eines char-Arrays. Bitte gib mir nun nacheinander die den Werten der Elemente entsprechenden ASCII-Zeichen aus, und zwar solange bis du auf ein Element mit dem Wert Null stößt."

Gibst du hingegen im printf() ein %ld an, bedeutet das "Wertes printf(), ich gebe dir hier den Wert genau __eines__ long. Bitte gib mir diesen Wert auf den Bildschirm aus."

Kapiert? :) Die Werte eines ganzen Arrays automatisch ausgeben lassen funktioniert beim printf() nur mit %s (dann mußt du aber auch wirklich einen char-Array übergeben). Für alle anderen Fälle mußt du selbst über die Werte des Arrays laufen und sie einzeln ausgeben.
 
Zurück
Oben