[C++][allg.]static char* & pipes

thooomy

Erfahrenes Mitglied
Guten abend zusammen !

Also ich grübele hier schon ne weile über so eine etwas problematische Funktion,
und ich glaube inzwischen mir fehlt hier einfach die Erfahrung bzw. die Funktionen ;) und wollte mal fragen ob mir da einer weiterhelfen kann.
Ich denke was sie machen soll ist klar: sie führt ein Kommandozeilenprogramm aus und
liest die Ausgabe zurück ins Programm - und übrigens : sie funktioniert auch ! :)

Welche Probleme gibts also:

1. damit mir der pBuffer nicht verloren geht wenn ich die Funktion ( die übrigens innerhalb einer Klasse ist und von einer Anderen Klasse aufgerufen wird) verlassen wird hab ich ihn einfach als "static" deklariert - was aber blöd ist weil beim zweiten aufruf der funktion der puffer immernoch voll mit den alten Daten ist (wie mach ich ihn am besten leer bzw. was gibts für alternativen ? )

2. Nun, ich hab einfach mal inziwschen das Gefühl das das ein ganz übler C++ Code ist (gemixt mit C usw.) und da muss es doch noch was bessres geben :) - Nachteilig ist allerdings das ich hier ohne "windows.h"&Co. auskommen muss (also keine ShellExecute Befehle und so).. nur STL und so portabel wie möglich eben

Hat jemand (auch allgemeine) Verbesserungsvorschläge ?
Bin schon mal im vorraus sehr dankbar.. hier der Code:

Code:
char const * HandleRes::getRes(const char* sExecuteCommandA ) {

  File* pProgPipe;
  static char pBuffer[STD_BUFF_SIZE]= "";

  std::string sFullsystem = sExecuteCommandA;
  sFullsystem = sFullsystem + " " +  sParamTest;  // Anhängen von Kommandozeilenvariablen (ausserhalb definiert)
  if ( ( pProgPipe = _popen( sFullsystem.c_str(), "rb")) == NULL ) {
    return("");
  }
  fread( pBuffer, STD_BUFF_SIZE , sizeof( char ), pProgPipe );
  if ( !pBuffer ) {
    return( "" );
  }
  fflush(pProgPipe);
  _pclose(pProgPipe);
  return( pBuffer );
}

aso: das ganze is in borland cbuilder 6.0
 
Zuletzt bearbeitet:
ööhm menno.. wieso schreibtn keiner was ?
zu einfach ? zu schwer ? zu unpräzise ? schon mal gestellt ?
lasst mich doch nich so hängen ;) ..

also auf die erste sache ne antwort würde mir schon reichen :(
 
Übergebe der Funktion einfach noch einen char-Pointer der auf den Speicherbereich zeigt in dem sich der Buffer befindet, so kannst du das Problem umgehen.
Oder du reservierst dir den Speicher in der Methode für den Buffer im Heap und gibst dann einen Zeiger zurück. Diese Variante klingt zwar villeicht vorerst besser, aber man vergisst dann oft den Speicher wieder freizugeben weil die Allokation beim Aufruf der Methode nicht offensichtlich ist für jemanden der die Klasse nicht selber geschrieben hat.
 
Danke erstmal für die Antwort. Die Übergabeparamter kann ich aber leider nicht ändern, da die Klasse von einer abstrakten Klasse abgeleitet ist, auf die ich keinen Einfluss habe.
Also das mit dem Speicher reservieren ist dann also auch nicht so optimal, da die Freigabe nicht gesichert ist.

mmh anscheinend gibt es da wirklich nicht so ne gute Methode, da so zu lösen... schade
 
Zurück