Archiv nach Schlagworten: C++

Heap Error finden mit GFlags – Debug

Beim Entwickeln kann es schnell mal sein, dass ein Buffer ungewollt über den allokierten Bereich überschrieben wird. Um einen Fehler dieser Art zu finden, bieten sich Tools von Mircosoft an:

https://developer.microsoft.com/en-us/windows/hardware/windows-driver-kit

Hat man die Tools installiert geht man mit der Konsole an folgend Ort:
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86

dort ruft man
gflags.exe /p
auf, um zu sehen welche Programme (Binaries) gerade überwacht werden.

Als nächsten Schritt müssen wir unser Programm einfügen (mit absolutem Pfad), PATH ist zu ersetzen
gflags.exe /p /full /enable PATH

Jetzt starten wir die Debug-Gui aus dem gleichen Ordner (C:\Program Files (x86)\Windows Kits\10\Debuggers\x86) mit dem Namen
windbg.exe
Ist das Programm gestartet kann man entweder einen laufenden Prozess (nicht aus anderer Debugging-Umgebung, sondern direkt gestartet) auswählen oder den Prozess direkt mit dem Windows Debugger starten.
Für den zweiten Fall kann die Session mit F5 gestartet werden.

Sobald der Heap-Error auftritt wird der entsprechende Code im Debugger angezeigt und die betroffene Zeile markiert.

Zum Schluss sollte die Überwachung wieder beendet werden, dies geschieht mit
gflags.exe /p /full /disable EXECUTEABLE
wobei hier nur der EXECUTEABLE Name angegeben werden muss und nicht der komplette Pfad

Quellen

https://blog.kowalczyk.info/article/1j9/gflags-a-debugging-story.html
https://developer.microsoft.com/en-us/windows/hardware/windows-driver-kit

VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

OpenCV :: Kinect VideoCapture data in IplImage

To use functions in OpenCV like cvSmooth or cvAdaptiveThreshold you must have the data of your VideoCapture in an IplImage object.

VideoCapture capture;
Mat grayImage;
IplImage *imgSrc, *imgResult;

imgSrc = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1);
imgResult = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1);

capture.open(CV_CAP_OPENNI);
if (!capture.isOpened()) {
	cout << "Can not open a capture object." << endl;
	return -1;
}
capture.set(CV_CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE, CV_CAP_OPENNI_VGA_30HZ);

for(;;) {
	if (!capture.grab()) {
		cout << "Can not grab images." << endl;
		return -1;
	}
	else {
		if (capture.retrieve(grayImage, CV_CAP_OPENNI_GRAY_IMAGE)) {
			imgSrc->imageData = (char *) grayImage.data;
			cvShowImage("Source", imgSrc);

			cvSmooth(imgSrc, imgResult, CV_BLUR, 100, 100);
			cvShowImage("Result", imgResult);
		}
	}
	if (waitKey(30) >= 0)
		break;
}
VN:F [1.9.22_1171]
Rating: 5.0/5 (1 vote cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

OpenCV :: Convert Mat into IplImage

I’ve search long time for having result on this problem. I want to use the object of IplImage, which data should be filled from Mat. If you using the simple solution found on stackoverflow, then you can’t access the methods of the IplImage object.

Mat matImage;
IplImage iplImage;

iplImage = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1);
iplImage->imageData = (char *) matImage.data;
VN:F [1.9.22_1171]
Rating: 5.0/5 (1 vote cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

LoadLibrary GetLastError 0x7E (126)

Beim Versuch eine als Release kompilierte DLL auf einem Rechner ohne Entwicklungsumgebung auszuführen kam es immer bei

LoadLibrary("name.dll");

wieder zu dem Fehler 0x7e (Das angegebene Modul wurde nicht gefunden).

Um dies zu beheben habe ich einfach mit dem dependency walker (http://www.dependencywalker.com) die DLL geöffnet und gesehen, dass die beiden Dateien msvcr100.dll und msvcr100d.dll fehlen.
Mein Projekt wurde auf Multithread-Dll (Release) kompiliert. Für mich kam die Möglichkeit, die DLL mit Unicode zu kompilieren nicht in Frage.

Gelöst habe ich das Problem auf eine sehr unschöne Art, aber eine mögliche.
Ich habe von meinem Entwicklungssystem die beiden DLLs genommen und auf den PC ohne Entwicklungsumgebung kopiert.
Ich sehe dieses Problem auf diese Weise noch nicht gelöst, aber vorerst tragbar. Bessere Lösungen sind sehr gerne willkommen!

VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

C/C++ unter Eclipse installieren

man muss g++, make und eclipse installieren, dann Eclipse starten und unter Help/Install New Software, bei work with folgenden Link auswählen:
http://download.eclipse.org/tools/cdt/releases/galileo

danach auf Add, alles herunterladen. Nach Abschluss der Installation Eclipse neu starten und es müsste alles funktionieren

VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Borland: Parabel, Kreis

um eine Parabel zu zeichen braucht man folgenden Code:

Image1->Canvas->MoveTo(0,pow(-300,2)/100);
for (int i=0; iCanvas->LineTo(i,pow(i-300,2)/100);
}

für einen Kreis

Image1->Canvas->Ellipse(50,50,500,500);
VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Borland auf Option bei mehreren Objekten zugreifen

Manchmal möchte man auf eine Option von mehrern Objekten zugreifen, so kann man zum Beispiel ganz viele Buttons haben, die haben automatisch alle die Option „Tag“. Um jetzt auf diesen allgemein zuzugreifen, müssen alle bei „OnClick“ auf die gleiche Funktion verweisen, und in dieser Funktion muss folgender Code verwendet werden

((TComponent *)Sender)->Tag
VN:F [1.9.22_1171]
Rating: 1.0/5 (1 vote cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Text aus Edit-feld in char ablegen

Ein Beispiel wie man den Text aus einem Edit-Feld in ein char-Array einfügt.
Hier wurde Borland C++ Builder verwendet

char str[200];
sprintf(str,"Hier das char-Array muss was rein");
AnsiString name = Edit1->Text;
strcat(str,name.c_str());
VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.22_1171]
Rating: +1 (from 1 vote)

nervige Leerzeichen und Zeilenumsprünge entfernen

Mit dem Befehl trim können nervie Leerzeichen und Zeilenumsprünge am Anfang und Ende eines Strings entfernt werden.

Hier ein Beispiel für C++

AnsiString test = " abcdefghijklm   ";
test = trim(test); //"abcdefghijklm"

analog auch in PHP

$test = " abcdefghijklm   ";
$test = trim($test); //"abcdefghijklm"
VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)