"net send" zusammenstellen durch Programm
-
for (i=0; i<=MAX_MESSAGE_LENGTH; i++) szNachricht[i] = NULL;
szNachricht ist 1000 element gross, also von 0 - 999. du überschreibst hier aber von 0 - 1000, also eins zuviel. Im Ram ist aber das szCompName Array direkt dahinter sodas du dessen erstes element auch überschreibts und somit dessen inhalt löscht.
Du kannst jetzt entweder das <= durch < ersetzten oder bei der Deklaration der Arrays eins draufzählen. Ich würde letztderes empfehlen, weil sonst auch deine Eingabeschleifen immer ein Zeichen zuviel eingeben lassen.
-
Cool, es funktioniert. newvet hatte recht. Es lag daran, dass ein Zeichen zuviel gelöscht wurde. Wenn man nichts eingibt, kommt wieder die Meldung - aber das ist ja egal. (Es ist gewesen, wie ich es befürchtet habe
, war doch irendwie klar (!?), dass ich so einen beschissenen Fehler gemacht habe.)
Ich danke hiermit noch einmal allen, die sich die Mühe gemacht haben, hier zu posten.
MfG, the flyingCoder.
-
Das Problem ist zwar eigentlich gelöst, aber es gibt noch zwei Sachen, die vielelicht wichtig sind.
1. Das nullsetzen von szNachricht kannst du dir komplett sparen
2. für szBuffer ist zu wenig Speicher reserviert. Überleg mal was passiert, wenn der Computername 30 Zeichen und die Nachricht 1000 Zeichen enthält (auch wenn es kaum vorkommen wird).
-
Deswegen verwendet man ja auch std::string, oder gehts hier um C *g*
MfG SideWinder
-
SideWinder schrieb:
Deswegen verwendet man ja auch std::string, oder gehts hier um C *g*
Als C-Fan kann man doch das hier machen:
typedef char * String;
Um mein Programm trotzdem zu perfektionieren:
/*(c) by flyingCoder :p */ #include <stdio.h> #include <stdlib.h> /* fuer system ()*/ typedef char * String; /* Oder würde das ein C++ Compiler nicht mögen :confused: */ int main (void) { String szCompName, szMessage; String szBuffer; printf ( "Hallo und herzlich willkommen bei \"netsendhelper\"."); printf ("\nEnter ohne zusätzlichen Text beendet das Programm."); printf ("\n\nGeben Sie den Computernamen oder die IP-Adresse des Computers"); printf ( "\nan, zu dem Sie Nachrichten schicken wollen: "); gets (szCompName); printf("\n\n"); do { printf("> "); gets (szMessage); if (szMessage[0] == '\0') break; sprintf(szBuffer, "net send %s %s", szCompName, szMessage); system (szBuffer); } while (1) ; return 0; }
Schön, oder?
Gruss,
flyingCoder.
-
Wenn ich den Computernamen eingebe und Enter drücke kommt eine "nette" Fehlermeldung: "Die Anweisung in "0x004013d1" verweist auf Speicher in "0xcccccccc". Der Vorgang "written" konnte nicht auf dem Speicher durchgeführt werden.
Klicken Sie auf "OK", um das Programm zu beenden.
Klicken Sie auf "Abbrechen", um das Programm zu debuggen. [OK/Abbrechen]"
Liegt das etwa daran, dass mein Speicher evt. kaputt ist?
-
...
typedef char * String; /* Oder würde das ein C++ Compiler
nicht mögen*/
int main (void)
{
String szCompName, szMessage;
String szBuffer;
...---> Autsch!!!
Jetzt hast du genau das Gegenteil von dem gemacht, was du machen solltest. Anstatt mehr Sepeicher zu reservieren, hast du jetzt gar keinen mehr reserviert und wenn man versucht in einen Speicherbereich zu schreiben, der einem nicht gehört, dann bringt Windows die tolle Fehlermeldung, die du beschrieben hast.
-
OMG
Und bitte jetzt keine Verbesserungen indem du in einem define auch noch malloc() aufrufst und den Speicher nicht mehr freigibst, spar dir die Arbeit :D.
MfG SideWinder
-
schuligung ...
Das mittypedef char * String;
war ein Beispiel aus meinem Kernighan/Ritchie.
-
Seite? Würd mich echt interessieren in welchem Zusammenhang die sowas schreiben :D.
MfG SideWinder
-
Ich vermute mal im Zusammenhang mit malloc() und realloc() *hoff*
...
-
SideWinder schrieb:
Seite? Würd mich echt interessieren in welchem Zusammenhang die sowas schreiben :D.
In der deutschen Ausgabe: S.140. Als Beispiel für "typedef".
Helft mir mal auf die Spünge: Was genau war nochmal "malloc ()"?flyingCoder.
-
Dynamische Speicherreservierung.
-
AJ schrieb:
Dynamische Speicherreservierung.
-
unsigned int anzchar = 0; char *buffer; //statische Speicherreservierung char buf[100]; //dynamische Speicherreservierung printf("Wie groß soll der Puffer sein? "); scanf("%ud", &anzchar); buffer = malloc(anzchar); printf("Bitte eine andere Größe wählen: "); scanf("%ud", &anzchar); buffer = realloc(buffer, anzchar);
Edit: unsigned int ist wohl sicherer