Hilfe - Suche - Mitglieder - Kalender
Vollansicht: gutes forum für programmierer
technoboard.at > Small Talk > Computer, Hardware & Software
Seiten: 1, 2
Shark T.
www.c-plusplus.de

hat mir schon desöfteren mal über meine programmierschwächen hinweg geholfen

mfg Shark T.
//goahead
Gutes Forum für Programmierer und dann nur an C++ Link is heuchlerisch ;-)

for tha Visual Basic Crowd
http://www.vb-fun.de
http://www.vb-archiv.de

brewing some Java
http://tinyurl.com/6xrdq

just HTML
http://www.selfhtml.org

Tja, ein C++ Tutorial hast eh selbst gepostet, somit wären meine favourites mit Tuturials abgedeckt =) Es sei denn, jemand möcht was über Simatics, Assembler, PLD-Programmierung und solchen Humbug wissen... futschlach.gif
//goahead
Btw.:

Saying that Java is nice because it works on all OS's
is like saying that anal sex is nice because it works on all genders!


Soviel dazu... jedenfalls sollten sich die programmierfreudigen technoboard-menschen mal zum Thema "Coding Style" schlau machen, wer das bis dato eben noch nicht gemacht hat.

Ein super .pdf File gibts vom Schmaranz (kluger Kopf auf der TU Graz, sehr angesehn was Coding Style und Programmieren im Allgemeinen angeht)... dieses File dürfte einem jeden zusagen, dessen Interesse auch nur geringst Richtung Programmierung geht
eigengrau
Ich hör immer Programmier und dann seh ich nur Foren für Programmiersprachen. Schon mal angeschaut wieviele es da gibt? http://www.99-bottles-of-beer.net// für einen kleinen Überblick.

Wer wirklich programmieren kann (oder können will) sollte sich nicht an einer Sprache festhalten. Es geht darum abstrakt zu denken und dafür braucht es Übung, Übung, Übung und dann braucht man keine speziellen Seiten, weil Google tuts auch.

b4n
someone
ein weiteres programmiererboard,...

(allerdings erst wieder neu im aufbau)

http://www.fground.com <- wink.gif
someone
naja eigentlich is es ein board wo sich hauptsächlich informatiker rumtreiben
Shark T.
Ich Programmiere sehr gut Simatic S7 in AWL und FUP. Halbwegs gut C in Skripten diverser automatisierungstools (also keine grafische Programmierung)

ein bisserl basic kann ich auch (mit befehlsliste, weil ohne kann das nix...)

assembler, hauptsächlich für microcontroller, aber ich würd mich auch an einen pentium prozessor wagen, wenns erforderlich ist, is ja saueinfach das assembler... einfach die befehlliste und die register und stack zuweisung der jeweiligen hardware und schon kann man loslegen.

aber mit so neumodernen zeug wie java hab ich nix am hut, das is was für homepagebastler und dergleichen und zu denen gehör ich ja nicht.

ich find www.c-plusplus.de deswegen so gut, weil da echt leute dabei sind die vom programmieren eine ahnung haben, und auf der seite gehts ned nur um c, sondern um viel mehr, ausser halt um die konkurrenz basic.... ich denk am logischen verständnis liegts bei mir nicht, eher daran, dass ich einfach zu wenig befehele auswendig weiss, hab nebenbei immer msdn. microsoft.com offen, um die syntax der befehle nachzuschlagen.


aber mein spezialgebiet ist simatic Step 7, is ja auch mein job, automatisierungssysteme zu programmieren und z.b. fertigungsstraßen zu projektieren und da führt halt mal kein weg an einer siemens sps vorbei, jeder der was anderes sagt hat noch nie die gravierenden unterschiede im handling der verschiedenen konkurrenzprodukte gesehen...

das einzige manko an siemens is, dass sie sich zu sehr an windows orientieren, was ab und an mal schon zu microsoftschen porobleme führen kann...


grüße Shark T.
Shark T.
ZITAT(//goahead @ 13. Aug 2004, 14:05 )
Btw.:

Saying that Java is nice because it works on all OS's
is like saying that anal sex is nice because it works on all genders!


Soviel dazu... jedenfalls sollten sich die programmierfreudigen technoboard-menschen mal zum Thema "Coding Style" schlau machen, wer das bis dato eben noch nicht gemacht hat.

Ein super .pdf File gibts vom Schmaranz (kluger Kopf auf der TU Graz, sehr angesehn was Coding Style und Programmieren im Allgemeinen angeht)... dieses File dürfte einem jeden zusagen, dessen Interesse auch nur geringst Richtung Programmierung geht

coding style meinst da so verständliche Kommentierung und übersichtliche Anbordnung des Codes?

Da bin ich ein schwarzes schaf, geb ich offen zu, ich kommentier sehr wenig, und mach das programm möglichst kompliziert, aber das aus dem einfachen grund, weil so nur ich für wartung und verbesserung herangezogen werden kann und nicht die konkurrenz
someone
die cplusplus leute sind sicherlich gut,.. aber java hat jetzt nicht hauptsächlich was mit web zu tun (ich bin KEIN java programmierer) also nicht mit java script verwechseln, gemeint sind auch keine applets fürs web oder so wink.gif


auf meiner kleinen page (fground) können die leute (bis auf einen) auch alle programmieren - wink.gif da wir informatiker sind,.. oder halt eben einen solchen beruf tätigen *lol*


naja, und was automatisierst du beruflich so ?
Shark T.
ZITAT(someone @ 14. Aug 2004, 13:00 )
naja, und was automatisierst du beruflich so ?

vollautomatische fertigungslinien, auch mit roboter, schweißautomaten

dann mach ich noch leittechnikapplikationen und qualitätserfassungssysteme(die software dazu)

usw usf
Ron Doe
ZITAT(Alpha600 @ 13. Aug 2004, 16:35 )
Wer wirklich programmieren kann (oder können will) sollte sich nicht an einer Sprache festhalten.

*word*

vielleicht weitet sich die diskussion ja noch aus, auf generationen von programmiersprachen, aussagenlogik, schaltalgebra, automaten, oder sonstiges...

dann machma hier eine developer knowledgebase...

bez. coding-style, mein lieblingssatz diesbezüglich:
real programers don't comment their code.
it was hard to write, and should be hard to read...
someone
hehe wäre eine interessante und erheiternde lektüre dieser thread wink.gif

übrigens interessanter job @ shark
Shark T.
ZITAT(someone @ 16. Aug 2004, 0:07 )
hehe wäre eine interessante und erheiternde lektüre dieser thread wink.gif

übrigens interessanter job @ shark

ich weiss ich weiss, hatte echt ein glück den zu bekommen, auch wenns ab und an mal auch etwas länger geht bei inbetriebnahmen, ich möcht den job ned so schnell gegen einen anderen eintauschen, auch wenns mehr geld gäbe!

mfg Shark T.
someone
jo ich versteh dich, bin mit meinem job/berufswahl auch voll und ganz zufrieden wink.gif
eigengrau
ZITAT(Ron Doe @ 15. Aug 2004, 22:28 )
bez. coding-style, mein lieblingssatz diesbezüglich:
real programers don't comment their code.
it was hard to write, and should be hard to read...

Das kommt von good ol' klingon programming *g* Aber nur wenn der andere meinen Code lesen kann denkt er sich "so hat der das gemacht - coole idee".

Ich weiss aber nicht ob es hier soviel Anklang findet wenn wir das Lamda Kalkül oder Turing Maschinen hier besprechen. Den meisten wird schon Brainfuck oder Befunge zuviel des guten sein (wo viele ja schon bei Lisp aufgeben *g*).

Aber vielleicht schreib ich im Urlaub einen Befunge-Interpreter und post ihn dann hier zur Kontrolle wink.gif

b4n
tecxx
FREAK *g*

achso, zum thema:

www.codeproject.com
www.codeguru.com
und die msdn.microsoft.com is auch recht fein zum coden lernen.
Shark T.
ZITAT(tecxx @ 16. Aug 2004, 3:33 )
FREAK *g*

achso, zum thema:

www.codeproject.com
www.codeguru.com
und die msdn.microsoft.com is auch recht fein zum coden lernen.

lernen tust bei der meikrosoft seeite nichts, du lernst maximal die befehle auswendig und befehle auswendig können hat eher nichts mit programmieren zu tun. woraufs ankommt, ist, dass man ein problem analyitsch betrachten kann und weiss, wie man das in einem programm umsetzen kann, sprachenunabhängig, sozusagen: es kommt darauf an, ob man fähig ist sich im kopf ein komplettes struktogramm denken zu können, oder nicht.
wenn man das kann, fehlt nicht mehr viel zum guten programmierer.
wenn man das nicht kann, dann wird man sich verdammt schwer tun, ein lauffähiges bugfreies programm zu schreiben.

mfg Shark T.
someone
muahahaha,.. bitte mach das wink.gif
Blunt Funk
ZITAT(Shark T. @ 16. Aug 2004, 8:25 )
ZITAT(tecxx @ 16. Aug 2004, 3:33 )
FREAK *g*

achso, zum thema:

www.codeproject.com
www.codeguru.com
und die msdn.microsoft.com is auch recht fein zum coden lernen.

lernen tust bei der meikrosoft seeite nichts, du lernst maximal die befehle auswendig und befehle auswendig können hat eher nichts mit programmieren zu tun. woraufs ankommt, ist, dass man ein problem analyitsch betrachten kann und weiss, wie man das in einem programm umsetzen kann, sprachenunabhängig, sozusagen: es kommt darauf an, ob man fähig ist sich im kopf ein komplettes struktogramm denken zu können, oder nicht.
wenn man das kann, fehlt nicht mehr viel zum guten programmierer.
wenn man das nicht kann, dann wird man sich verdammt schwer tun, ein lauffähiges bugfreies programm zu schreiben.

mfg Shark T.


looool
someone
smile.gif wo er recht hat hat er recht *g*
LEKI
das einzige was ich halbegs regelmäßig programmier ist PHP (wenn man das programmieren nennen darf) ... dazu gibts ein paar eckpfeiler:

www.php.net (alle Funktionen mit umfangreichen beschreibungen - wenn verfügbar auch in deutsch, inkl. jeder menge Beispiele)
www.selfhtml.org ... eh schon wissen wink.gif
www.selfphp.info ... selbiges in grün wink.gif

und das ultimative Ebook für das erlernen von php & mysql von grund auf:
DSP: Datenbanken, MySql und PHP

und eine Hand voll Ebooks smile.gif

PS.: falls wer für eine bestimmte programmiersprache ein ebook benötigen sollte -> PrivatMessage
Luke Kavis
ZITAT(Blunt Funk @ 16. Aug 2004, 12:43 )
ZITAT(Shark T. @ 16. Aug 2004, 8:25 )
ZITAT(tecxx @ 16. Aug 2004, 3:33 )
FREAK *g*

achso, zum thema:

www.codeproject.com
www.codeguru.com
und die msdn.microsoft.com is auch recht fein zum coden lernen.

lernen tust bei der meikrosoft seeite nichts, du lernst maximal die befehle auswendig und befehle auswendig können hat eher nichts mit programmieren zu tun. woraufs ankommt, ist, dass man ein problem analyitsch betrachten kann und weiss, wie man das in einem programm umsetzen kann, sprachenunabhängig, sozusagen: es kommt darauf an, ob man fähig ist sich im kopf ein komplettes struktogramm denken zu können, oder nicht.
wenn man das kann, fehlt nicht mehr viel zum guten programmierer.
wenn man das nicht kann, dann wird man sich verdammt schwer tun, ein lauffähiges bugfreies programm zu schreiben.

mfg Shark T.


looool

da muss ich mich mit dem lolen anschließen....

das klingt als würd da wer einen vortrag über programmieren halten wollen der selber 0 ahnung davon hat... smile.gif und bevor jetz die attacke zurück kommt, weil ich ja der unwissende bin......ich skripte php & mysql (weil das sind keine programmiersprachen) und programmiere java auf der uni.... ein bisschen kenn ich mich aus, bin kein guru aber das zeug hat da hat mich wieder zum schmunzeln gebracht.... smile.gif
LEKI
ahhh jetzt weiß ich endlich daß ich nicht programmiere sondern auch nur "scripte" wußte nicht daß das so heißt - wo is da der spezifizierte unterschied???

Zu dem zitat: strukturiertes denken ist denk ich grundvoraussetzung, aber daß heißt noch lange nicht daß es keinen Unterschied gibt ob man in Basic oder php ein bißchen was proggt oder ob man ein Objektorientierter C - Delphi - was weiß ich was Guru ist. -> nicht jeder der autofahren kann, ist fähig einen formel1 wagen zu steuern wink.gif
Shark T.
wie gesagt ich bin Automatiserungstechniker und hab von Beruf wegen mit Programmieren zu tun, darum kenn ich mich auch etwas aus, muss ich ja wohl.

@ luke kavis, wenns da am logischen verständnis fehlt kannst ned progammiern, so einfach is das, auch wennstas amüsant findest...
minus delta negativ
ZITAT(Shark T. @ 16. Aug 2004, 8:25 )
ZITAT(tecxx @ 16. Aug 2004, 3:33 )
FREAK *g*

achso, zum thema:

www.codeproject.com
www.codeguru.com
und die msdn.microsoft.com is auch recht fein zum coden lernen.

lernen tust bei der meikrosoft seeite nichts, du lernst maximal die befehle auswendig und befehle auswendig können hat eher nichts mit programmieren zu tun. woraufs ankommt, ist, dass man ein problem analyitsch betrachten kann und weiss, wie man das in einem programm umsetzen kann, sprachenunabhängig, sozusagen: es kommt darauf an, ob man fähig ist sich im kopf ein komplettes struktogramm denken zu können, oder nicht.
wenn man das kann, fehlt nicht mehr viel zum guten programmierer.
wenn man das nicht kann, dann wird man sich verdammt schwer tun, ein lauffähiges bugfreies programm zu schreiben.

mfg Shark T.

ich glaube das eigentliche thema hieß "gutes forum für programmierer" und nicht "shark t. ist der beste programmierer der welt *lol* wink.gif

die von tecxx genannten foren sind auch meine favourites, insbesondere die codeproject-seite!! orientieren sind jedoch rein auf microsoft-plattformen muß dazugesagt werden.

jedoch nochmal zu shark: msdn und die beiden foren richten sich an experten, sie setzen voraus daß man nicht nur ein gutes maß an analytischem verständnis mitbringt, sondern auch, daß man die sprache in der man entwickelt perfekt beherrscht. was du als "auswendiglernen von befehlen" bezeichnest sind lösungen für komplexe problemstellungen die einem in der praxis mitunter begegnen, aufbauend auf der kenntnis der sprache. jemand der weiß wie man einen hammer hält ist noch lang kein guter zimmermann wink.gif

naja .. für anfänger ist dies also bestimmt die falsche stelle, eine der sprachen zu erlernen!

also nix für ungut aber ich finde das musste mal gesagt werden smile.gif

greetings
LEKI
ZITAT(LEKI @ 23. Aug 2004, 16:07 )
nicht jeder der autofahren kann, ist fähig einen formel1 wagen zu steuern

ZITAT(falloutboy @ 23. Aug 2004, 18:39 )
jemand der weiß wie man einen hammer hält ist noch lang kein guter zimmermann wink.gif

...sag ich ja *G* ... simma eh alle einer meinung *hehe* biggrin.gif
minus delta negativ
ZITAT(Shark T. @ 14. Aug 2004, 3:02 )
ich kommentier sehr wenig, und mach das programm möglichst kompliziert, aber das aus dem einfachen grund, weil so nur ich für wartung und verbesserung herangezogen werden kann und nicht die konkurrenz

erst jetzt gelesen aber ....

WUUUUUAAAAAAAAAA .. da platzt einem der schon öfters derartige missgeburten weiterwarten musste der kragen !!!

du wischst mit der "genialen taktik" ja nicht nur kollegen die an deinen projekten weiterarbeiten müssen eins aus sondern auch dir selbst. wenn du bestimmte programmteile jahre nicht mehr angreifst und dann plötzlich wieder eine änderung oder fehlerbehebung an einem "möglichst kompliziert codierten und möglichst wenig kommentierten" teil des programms durchführen sollst, dann wünsch ich dir viel vergnügen bei der anschliessenden selbstgeisselung wink.gif

naja - trotzdem schöne grüsse wink.gif
josef
entschuldigung dass ich mich in diese diskussion einmische, aber was ich hier lese, das ist so haarestraeubend dass ich einfach meinen senf dazugeben muss.

vor allem der herr unter dem pseudonym 'shark t.', scheint sich hier als einaeugiger unter den blinden auf zu spielen.

"Ich Programmiere sehr gut Simatic S7 in AWL und FUP. Halbwegs gut C in Skripten diverser automatisierungstools (also keine grafische Programmierung)/
(...) ein bisserl basic kann ich auch (mit befehlsliste, weil ohne kann das nix...)"

ok, also zuerst muss ich dir mal sagen, so leid es mir tut, du kannst nicht 'programmieren', was du hier erzaehlst, hat ueberhaupt nichts mit programmieren zu tun. es handelt sich um stupides aneinanderreihen von simplen instruktionen.

"aber mit so neumodernen zeug wie java hab ich nix am hut, das is was für homepagebastler und dergleichen und zu denen gehör ich ja nicht."

au contraire, mon ami, weisst du ueberhaupt was java ist? alleine diese aussage ist schon ein zeugnis dass du dich wohl zu weit aus deinem fenster lehnst.

"coding style meinst da so verständliche Kommentierung und übersichtliche Anbordnung des Codes?
Da bin ich ein schwarzes schaf, geb ich offen zu, ich kommentier sehr wenig, und mach das programm möglichst kompliziert, aber das aus dem einfachen grund, weil so nur ich für wartung und verbesserung herangezogen werden kann und nicht die konkurrenz"

mit dieser aussage hast du echt den vogel abgeschossen. ich hab diesen absatz 5x lesen muessen um sicher zu gehen dass du hier keinen sarkasmus verwendest. ich kann es immer noch nicht glauben, dass du das hier ernst meinst.
ich ueberleg schon diese aussage als email signature zu verwenden, das ist ja echt der oberbrueller. ich mein, wie hirnverdreht kann man sein dass man so etwas denkt, ich kann dir garantieren mit so einer einstellung wirst du dich nicht lange in deinem job halten. wenn jemand mal ueber deine arbeit drueberschaut...

ich hab leider nicht die zeit noch mehr auf die angeschnittenen themen hier einzugehen, ich sag nur 'schuster bleib bei deinen leisten' diskutiert lieber ueber techno... wink.gif
Luke Kavis
Ich diskutier auch gern über programmieren, tu ich oft genug am informatik-forum der tu wien, das mit dem kommentieren hab ich auch überlesen muss aber auch über diese aussage laut brüllen....

@ shark

selbst nach 6 monaten konnte ich ein simples shopsystem das ich selbst von grund auf selbst entworfen hab nimmer nachvollziehen. aber vielleicht liegt das ja auch daran dass mein hirn einfach zu klein ist.... seufz. ich armer...

programmieren und logik liegen vielleicht beieinander, die logik kommt aber mit dem programm und zwar mit der entwicklung. natürlich weiss ich von vorn herein welche routinen ich gleich alle in eigene objekte und functions schreib, sicher das komplette programm ist im kopf fertig und zwar ohne diese lästigen /* */ kommentare.....
wenn du einmal software engineering gemacht hast, wirst du wissen wie man an ein projekt geht und dass es verdammt schwierig ist von vorn herein alles "logisch" zu machen. weil dinge die dir von anfang an logisch erscheinen sinds im laufe des projekts aber überhaupt nimmer.... aber nachdem dein programm ja nur dann gut läuft wenns 0 comments hat und logischst ausprogrammiert ist am besten mit dem konzept vorher.... na dann kann ich mir schon denken dass du eine bereicherung für deinen arbeitgeber bist... *thumbs up, sharky*


@ topic.... sorry dass ich so abkomme aber wenn ich all das les platzt mir noch eher der kragen als bei der 10000den schranz diskussion.

@ ontopic.....

ich selbst verwende für scripting gerne selfhtml und selfphp, php.net ist ganz gut wobei man da nie davon ausgehen kann ob auch wirklich alle funktionen (gibt ja jede menge ausgefallener) in die vorgegebene php version hineinkompiliert wurden.
für java nehm ich ehrlich gesagt lieber ein buch zur hand oder direkt die große hilfe auf http://java.sun.com

ach ja und wenn gar nix mehr geht dann helfen die kollegen von www.informatik-forum.at smile.gif

lg, Phil.
Slavko Milosevic
Was Sharky sagt klingt mir sehr nach der Lehrweisheit die mein Informatiklehrer auf der HTL immer zu predigen pflegt: Das eigentliche "Programmieren" ist das komplette vorplanen der "Programmlogik" bis ins kleinste Detail und am besten noch mit einem Struktogramm während das Scripten ja nur noch eine stupide Abschreibarbeit ist wos nicht ankommt in welcher Sprache mans macht...einfach der volle Blödsinn. Die Sprache zwingt einem die ganze Denkweise des Herangehens auf, und detailiertes vorplanen ist nicht. Ich weis net wies euch geht aber wenn das Teil mehr als 3 variablen hat steig ich aus, da muss ma das ganz plump wo reincoden...Programmieren hat nix mit elementarer Logik zu tun, wer auf das aus ist soll halt mal Kant lesen oder was weis ich, Programmieren ist ein schmutziges, krankes Handwerk happy.gif ein bisschen wie Auflegen...
tecxx
ich progammiere seit 4 jahren vc++ und ich sag dazu nur mehr eins:

QUELLTEXT
// get the codec
int GetCodecClsid(const WCHAR* format, CLSID* pClsid)
{
    UINT num = 0;  // number of image encoders
    UINT size = 0; // size of the image encoder array in bytes

    ImageCodecInfo* pImageCodecInfo = NULL;

    GetImageEncodersSize(&num, &size);
    if(size == 0)
 return -1; // Failure

    pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
    if(pImageCodecInfo == NULL)
 return -1; // Failure
   
    GetImageEncoders(num, size, pImageCodecInfo);

    for(UINT j = 0; j < num; ++j)
    {
 if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
 {
     *pClsid = pImageCodecInfo[j].Clsid;
     free(pImageCodecInfo);
     return j; // Success
 }
    } // for

    free(pImageCodecInfo);
    return -1; // Failure
} // GetCodecClsid


// convert byte buffer to hex buffer
CString ByteBufferToHexBuffer(LPBYTE buf, unsigned long iBufLen)
{
    register DWORD dwPos;
    register DWORD dwBufpos;
    const char hex [17] = {'0', '1', '2', '3', '4', '5', '6', '7', '8',
     '9', 'a', 'b', 'c', 'd', 'e', 'f', 'x'};
    char* outbuff;
    outbuff = new char[iBufLen*2+1]; // string representation is 2chars per byte
    dwBufpos = 0;
    for (dwPos = 0; dwPos < iBufLen; dwPos++)
    {
 outbuff[dwBufpos++] = hex[(buf[dwPos]>>4)];
 outbuff[dwBufpos++] = hex[(buf[dwPos]%0x10)];
    }
    outbuff[dwBufpos] = '\0';
    CString strRet = CString(outbuff);
    delete[] outbuff;
    return strRet;
}

// convert any image to either bmp or wmf and automatically resize it
int ImageConvert(CString strFilenameSource, CString strFilenameTarget,
     HDC hRefDC,
     COLORREF cBackground,
     int iTargetFormat,
     sImageConvertSizes& sICS)
{
    #ifdef _DEBUG
    #define SAVED_NEW new
    #undef new
    #endif
    {
 WCHAR *p = NULL;
 Image* imgOriginal = NULL;
 Image* imgTarget = NULL;
 CLSID Codec;

 ///////////////////////////////////////////////////////////////////////////
 // open the image
 p = strFilenameSource.AllocSysString();
 imgOriginal = new Image(p, NULL);
 SysFreeString(p);

 Status status = imgOriginal->GetLastStatus();
 if (status != Ok)
 {
     delete imgOriginal;
     return IMAGECONVERT_ERROR_CANNOTLOADSOURCE;
 }

 ///////////////////////////////////////////////////////////////////////////
 // calculate new image size
 int iSourceImageW = imgOriginal->GetWidth();
 int iSourceImageH = imgOriginal->GetHeight();
 int iTargetImageW = iSourceImageW;
 int iTargetImageH = iSourceImageH;
 if ( (sICS.m_bExactWidth == true) || (iSourceImageW > sICS.m_iWidth))
     iTargetImageW = sICS.m_iWidth;
 if ( (sICS.m_bExactHeight == true) || (iSourceImageH > sICS.m_iHeight))
     iTargetImageH = sICS.m_iHeight;
 if (sICS.m_bKeepAspect)
 {
     // we want to keep the aspect ratio
     float iPercentW = (100/(float)iSourceImageW)*(float)iTargetImageW;
     float iPercentH = (100/(float)iSourceImageH)*(float)iTargetImageH;

     float iPercent;
     if (iPercentW < iPercentH)
   iPercent = iPercentW;
     else
   iPercent = iPercentH;

     // then resize the other size based on the calculated percentage
     iTargetImageH = (int)(((float)iSourceImageH/100)*iPercent);
     iTargetImageW = (int)(((float)iSourceImageW/100)*iPercent);
 }
 // rtf keyword picgoal values
 int iPicHGoal, iPicWGoal;
 iPicHGoal = iTargetImageH * 15;
 iPicWGoal = iTargetImageW * 15;

 ///////////////////////////////////////////////////////////////////////////
 // resize and draw source into new bitmap, fill new bitmap with background color
 imgTarget = new Bitmap(iTargetImageW, iTargetImageH);
 {
     Graphics graphics(imgTarget);
     // fill with background color
     Color cColor(GetRValue(cBackground), GetGValue(cBackground), GetBValue(cBackground));
     graphics.Clear(cColor);
     // always resize the image - doesn't work the other way
     graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);
        Rect destRect (0, 0, iTargetImageW, iTargetImageH);
     graphics.DrawImage(imgOriginal,
       destRect,
       0, 0, // upper-left corner of source rectangle
       iSourceImageW, // width of source rectangle
       iSourceImageH, // height of source rectangle
       UnitPixel);
     delete imgOriginal;
 }

 // bitmap created, save it
 CString strTemp;
 if (iTargetFormat == IMAGECONVERT_TARGETFORMAT_BMP)
     strTemp = strFilenameTarget;
 else
     strTemp = strFilenameSource + ".bmp";

 // save the bitmap to the harddisk
 GetCodecClsid(L"image/bmp", &Codec);
 p = strTemp.AllocSysString();
 imgTarget->Save(p, &Codec, NULL);  
 SysFreeString(p);

 // check status
 status = imgTarget->GetLastStatus();
 delete imgTarget;
 if (status != Ok)
     return IMAGECONVERT_ERROR_CANNOTCREATETARGET;

 if (iTargetFormat == IMAGECONVERT_TARGETFORMAT_WMF)
 {
     // create a DIB bitmap based on the temporary bitmap
     HBITMAP hbmtemp = (HBITMAP)::LoadImage(NULL, strTemp, IMAGE_BITMAP, 0,0, LR_DEFAULTCOLOR | LR_LOADFROMFILE | LR_CREATEDIBSECTION);
     if (hbmtemp == NULL)
   return IMAGECONVERT_ERROR_LOADIMAGEFAILED;
     Bitmap* newBmp = new Bitmap(hbmtemp, NULL);
     // delete the temporary bitmap
     ::DeleteObject(hbmtemp);
     TRY{CFile::Remove(strTemp);}CATCH_ALL(e){}END_CATCH_ALL

     ///////////////////////////////////////////////////////////////////////////
     // create a metafile
     p = strFilenameTarget.AllocSysString();
     Rect targetRect(0,0, iTargetImageW, iTargetImageH);
     imgTarget = new Metafile(p, hRefDC, targetRect, MetafileFrameUnitPixel, EmfTypeEmfOnly);
     SysFreeString(p);
     // draw bitmap into metafile
     {
   Graphics graphics(imgTarget);
   graphics.DrawImage(newBmp, 0, 0);
   delete newBmp;
     }

     ///////////////////////////////////////////////////////////////////////////
     // convert the metafile to a wmf structure
     // get handle to the emf structure
     HENHMETAFILE hEMF = ((Metafile*)imgTarget)->GetHENHMETAFILE();
     // get rid of target image
     delete imgTarget;
     // get needed buffer size
     UINT iSize = Metafile::EmfToWmfBits(hEMF, 0, NULL);
     if (iSize == 0)
     {
   ::DeleteEnhMetaFile(hEMF);
   return IMAGECONVERT_ERROR_EMFTOWMF_BUFZERO;
     }
     // do the conversion      
     LPBYTE wmfbuf = new BYTE[iSize];
     memset(wmfbuf, 0, iSize);
     int iRet = Metafile::EmfToWmfBits(hEMF, iSize, wmfbuf);
     // delete emf structure
     ::DeleteEnhMetaFile(hEMF);

     ///////////////////////////////////////////////////////////////////////////
     // convert the metafile to a hexstring
     CString strFileContent;
     strFileContent.Format("{\\pict\\wmetafile8\\pichgoal%d\\picwgoal%d \r\n", iPicHGoal, iPicWGoal);
     strFileContent += ByteBufferToHexBuffer(wmfbuf, iRet) + "}";
     delete[] wmfbuf;
     // write hexstring to harddisk
     CStdioFile fTarget;
     fTarget.Open(strFilenameTarget, CFile::modeWrite | CFile::modeCreate | CFile::typeText);
     fTarget.Write(strFileContent, strFileContent.GetLength());
     fTarget.Close();
 }

    }
    #ifdef _DEBUG
    #define new SAVED_NEW
    #endif

    // conversion ok
    return IMAGECONVERT_ERROR_OK;
Luke Kavis
sehr angenehm zu lesen! smile.gif
Ron Doe
das war ja jetzt auch bitter nötig...

lasst uns nur noch in code-teilen kommunizieren withstupid.gif

achja, programmier auch schon seit 10 jahren so einiges....
eigengrau
So ... mir war fad. Befunge Interpreter für CLI von PHP5 hier als Source (zu verwenden wie auch immer - aber mit Nennung vom ursprünglichen Autor bei weiterentwicklung). Wer kein PHP5 zur Hand hat und nicht mal schnell "./configure ; make ; make install" machen möchte kann natürlich die throws durch trigger_error() ersetzen und die PPP-Keywords weg lassen.

QUELLTEXT
#!/usr/local/bin/php
<?php

error_reporting(E_ALL);

define('DIR_UP', 0);
define('DIR_RIGHT', 1);
define('DIR_DOWN', 2);
define('DIR_LEFT', 3);

class Befunge {
    private $direction = DIR_RIGHT;
    private $x = 0;
    private $y = 0;
    private $max_x = 0;
    private $max_y = 0;
    private $code = 0;
    private $stack = array();
    private $string_mode = false;
    public $debug = false;
    public $disable_input = false;
    
    public function __construct($code) {  
 $code = str_replace(array("\n\r", "\r\n", "\r\r", "\n\n", "\r"), "\n", $code);
 $this->code = explode("\n", $code);
 foreach($this->code as $num=>$line) {
     $this->max_y = $num;
     if(strlen($line) > $this->max_x) {
   $this->max_x = strlen($line);
     }
 }
    }
    
    private function get_instruction() {
 if($this->x > strlen($this->code[$this->y])) {
     return ' ';
 } else {
     return $this->code[$this->y]{$this->x};
 }
    }
    
    private function move_ip($step = 1, $direction = null) {
 if(!is_null($direction)) {
     $this->direction = $direction;
 }
 
 switch($this->direction) {
     case DIR_UP:
   --$this->y;
   break;
     case DIR_RIGHT:
   ++$this->x;
   break;
     case DIR_DOWN:
   ++$this->y;
   break;
     case DIR_LEFT:
   --$this->x;
   break;
     default:
   throw new Exception('move_ip(): unknown direction '.$this->direction);
 }

 if($this->y > $this->max_y) {
     $this->y = $this->y % $this->max_y;
 }
 if($this->y < 0) {
     $this->y = $this->y % $this->max_y + $this->max_y;
 }
 if($this->x > $this->max_x || $this->x < 0) {
     $this->x = $this->x % $this->max_x;
 }
 if($this->x < 0) {
     $this->x = $this->x % $this->max_x + $this->max_x;
 }
    }
    
    private function evalute_instruction($instruction) {
 if($this->string_mode && $instruction != '"') {
     $this->stack_push(ord($instruction));
     $this->move_ip();
     return;
 }
 
 switch($instruction) {
     case '0':      
     case '1':    
     case '2':      
     case '3':      
     case '4':    
     case '5':      
     case '6':      
     case '7':      
     case '8':      
     case '9':
   $this->stack_push($instruction);
   break;
     case '"':
   $this->string_mode = !$this->string_mode;
   break;
     case '+':
   $a = $this->stack_pop();
   $b = $this->stack_pop();    
   $this->stack_push($a + $b);
   break;
     case '-':
   $a = $this->stack_pop();
   $b = $this->stack_pop();    
   $this->stack_push($b - $a);
   break;
     case '*':
   $a = $this->stack_pop();
   $b = $this->stack_pop();    
   $this->stack_push($a * $b);
   break;
     case '/':
   $a = $this->stack_pop();
   if(!$a) {
       throw new Exception('evalute_instruction(): division by zero');
   }
   $b = $this->stack_pop();    
   $this->stack_push((int)($b / $a));
   break;
     case '%':
   $a = $this->stack_pop();
   if(!$a) {
       throw new Exception('evalute_instruction(): division by zero');
   }
   $b = $this->stack_pop();    
   $this->stack_push($b % $a);
   break;
     case '!':
   $this->stack_push($this->stack_pop() ? 0 : 1);
   break;
     case '`':
   $a = $this->stack_pop();
   $b = $this->stack_pop();    
   $this->stack_push($b > $a ? 1 : 0);
   break;
     case '^':
   $this->move_ip(1, DIR_UP);
   return;
   break;
     case '>':
   $this->move_ip(1, DIR_RIGHT);
   return;
   break;
     case 'v':
   $this->move_ip(1, DIR_DOWN);
   return;
   break;
     case '<':
   $this->move_ip(1, DIR_LEFT);
   return;
   break;
     case '?':
   $this->move_ip(1, rand(0,3));
   return;
   break;
     case '_':
   $this->move_ip(1, $this->stack_pop() ? DIR_LEFT : DIR_RIGHT);
   return;
   break;
     case '|':
   $this->move_ip(1, $this->stack_pop() ? DIR_UP : DIR_DOWN);
   return;
   break;
     case ':':
   $a = $this->stack_pop();
   $this->stack_push($a);
   $this->stack_push($a);    
   break;
     case '\\':
   $a = $this->stack_pop();
   $b = $this->stack_pop();
   $this->stack_push($a);  
   $this->stack_push($b);  
   break;
     case '$':
   $this->stack_pop();
   break;
     case '.':
   $this->output($this->stack_pop());
   break;
     case ',':
   $this->output(chr($this->stack_pop()), true);
   break;
     case '#':
   $this->move_ip(2);
   return;
   break;
     case 'g':
   $y = $this->stack_pop();
   $x = $this->stack_pop();
   if($x > $this->max_x || $y > $this->max_y) {
       throw new Exception("evalute_instruction(): cannot get from position ($x|$y) - out of range");
   }
   $this->stack_push($this->code[$y]{$x});
   break;
     case 'p':
   $y = $this->stack_pop();
   $x = $this->stack_pop();
   $v = $this->stack_pop();
   if($x > $this->max_x || $y > $this->max_y) {
       throw new Exception("evalute_instruction(): cannot put to position ($x|$y) - out of range");
   }
   $this->code[$y]{$x} = chr($v);
   break;
     case '&':
     case '~':
   if($this->disable_input) {
       throw new Exception("evalute_instruction(): input instructions are diabled");
   }
   $input = fgets(STDIN);
   if($input === false) {
       throw new Exception("evalute_instruction(): cannnot read from STDIN");
   }
   if($instruction == '&') {
       $input = trim($input);
       if(!is_numeric($input)) {
     throw new Exception("evalute_instruction(): you did not enter a number");
       }
       $input = (int)$input;
   } else {
       $input = ord($input{0});        
   }
   $this->stack_push($input);
   break;
     case ' ':
     case "\t":
   break;
     default:
   throw new Exception("evalute_instruction(): $instruction is unkown");
   break;
 }
 
 $this->move_ip();
    }
    
    private function stack_pop() {
 if(empty($this->stack)) {
     throw new Exception('stack_pop(): stack is empty - nothing to pop');
 }
 return array_pop($this->stack);
    }
    
    private function stack_push($value) {
 return array_push($this->stack, $value);    
    }
    
    private function output($value, $literal = false) {
 if(!$literal) {
     $value = "($value) ";
 }
 
 if($this->debug) {
     $value = "\n\tOutput: $value\n";
 }
 
 echo $value;
    }
    
    private function print_code() {
 echo "\n[Code]\n";
 foreach($this->code as $y=>$line) {
     echo ' ';
     $length = strlen($line);
     for($x = 0; $x < $length; ++$x) {
   if($y == $this->y && $x == $this->x) {
       echo "\010[";
   }
   echo $line{$x};
   if($y == $this->y && $x == $this->x) {
       echo ']';
   } else {
       echo ' ';
   }
     }
     echo "\n";
 }
    }
    
    private function print_stack() {
 echo "\n[Stack]\n";
 if(empty($this->stack)) {
     echo '(empty)';
 }
 foreach($this->stack as $val) {
     echo '[';
     if($val > 32) {
   echo chr($val).'=';
     }
     echo $val.'] ';
 }
    }

    public function run() {
 while(1) {
     $instruction = $this->get_instruction();
     if($this->debug) {
   $this->print_stack();
   $this->print_code();
     }
     if($instruction == '@') {
   return;
     } else {
   $this->evalute_instruction($instruction);
     }
 }
    }
}

if(in_array('--help', $argv) || in_array('-h', $argv)) {
    echo <<<USAGE
    
Befunge interpreter
Author: Nico Edtinger <[email protected]>
 
$argv[0] {--input <filename>} {--debug}
    --input
 filename for your befunge file, default is stdin
    --debug
 output debug information  

USAGE;
    die();
}

$disable_input = false;

if(in_array('--input', $argv)) {
    $filename = $argv[array_search('--input', $argv) + 1];
    if(!file_exists($filename)) {
 throw new Exception($filename.' not found');
    }
} else {
    $filename = 'php://stdin';
    $disable_input = true;
    
}


$code = file_get_contents($filename);

$befunge = new Befunge($code);
if(in_array('--debug', $argv)) {
    $befunge->debug = true;
}
if($disable_input) {
    $befunge->disable_input = true;
}
$befunge->run();

echo "\n";
?>


Wer noch Kommentare zu Befunge braucht (und damit zum obrigen Script): http://en.wikipedia.org/wiki/Befunge - und wer noch fragt "was mach ich jetzt damit?" - bitte Befunge-Code schreiben der Fibonacci Zahlen berechnen kann. Have fun.

b4n
Shark T.
gut ich gebs zu, kann nicht programmieren, wie konnt ich nur so dumm sein das zu glauben! hab ja außerdem nie gesagt, dass ich ein profi bin, nur dass ich etwas ahnung davon hab. und jetzt lassma des bevor noch wer so lächerliche kommentare wie ich ablässt und einfach versucht zu diskutieren ohne andere persönlich anzugreifen...
wink.gif

es war echt ein fehler unter euch geeks zu behaupten ein bischen programmieren zu können...

blush.gif

so long...

Shark T.
Ron Doe
ZITAT(Alpha600 @ 24. Aug 2004, 3:21 )
So ... mir war fad. Befunge Interpreter für CLI von PHP5 hier als Source (zu verwenden wie auch immer - aber mit Nennung vom ursprünglichen Autor bei weiterentwicklung). Wer kein PHP5 zur Hand hat und nicht mal schnell "./configure ; make ; make install" machen möchte kann natürlich die throws durch trigger_error() ersetzen und die PPP-Keywords weg lassen.

und jetzt noch prolog...
Andros
ich bin softwareentwickler und programmierer und programmier bzw beschäftig mich damit seit ich 7 bin und i sag euch eins - tuts euch net so stresesn, is sowieso alles nur copy&paste wink.gif

ansonsten sind die bücher ansi c von da htl ganz gut und sonst hilft die f1 taste eigentlich immer!
eigengrau
F1 stellt bei mir den Bildschirm dünkler - damn Powerbook wink.gif

Aber wenn Programmieren eh nur Copy&Paste is wünsch ich dir viel Spass in den absonderlichen Programmiersprachen wie Befunge oder Brainfuck. Manche von uns wollen doch ein bissl mehr als ein Codemonkey sein. Aber vielleicht kommt ja wenn man 1000 Affen auf Tastaturen hämmern läßt irgendwann Windows raus - oder wars doch Shakespeare wink.gif

Nein aber eigentlich ist copy&paste nur wirklich brauchbar wenn man private Programme entwirft und Internet zur Verfügung hat. Wie lustig war das noch als die brauchbarste Doku Ralf Browns Interrupt List war (und die Borland-C Hilfe) und Internet nur einmal im Monat verwendet werden konnte.

b4n
Andros
hmm vielleicht war copy&paste hier von mir etwas zu verallgemeinernd geschriebn wink.gif

das man algorithmen welcher art auch immer meistens net von irgendwoher kopiern kann is eh selbstverständlich -> kommt ja äussert selten vor 2 identische specs vor sich liegn zu haben.

meinte damit eher den grundlegenden logikaufbau eines programms bzw die unterschiedlichen lösungswege die man einschlagen kann um ein problem/funktion zu bewältigen. wink.gif

ein bissl selber denken um das wird ma nie herumkommen -> nur das rad jedesmal neu zu erfinden ist äusserst unkonventionell und auch net besonders wirtschaftlich wink.gif
josef
ZITAT(tecxx @ 23. Aug 2004, 21:49 )
ich progammiere seit 4 jahren vc++ und ich sag dazu nur mehr eins:

[code/snip]

also dass sieht ja schon ganz gut aus, aber das geht noch besser.
vor allem, was sind das fuer slash balken?

http://www.freebsd.org/cgi/man.cgi?query=s...rts&format=html

ein gutes beispiel fuer einen styleguide.


und wenn wir gerade bei den schwanzlaengenvergleichen sind, soll ich jetzt einen meiner selbstgeschriebenen
compiler hier reinpasten? oder einen treiber?

oder machen wir es sinnvoller und diskutieren lieber eine runde.
tecxx
ich wollte hier nicht schwanzvergleichen, keine angst *g*
ich fands nur lustig dass hier "msdn hilft beim coden absolut überhaupt nicht" gemeldet wurde. ich habe mein programmierwissen zu 90% aus der msdn und das ist erstens ein solides wissen, und zweitens zeigt es sehr wohl, WIE man programmiert. daher das code-snippet... (und das ist übrigens nicht copy&paste sondern selbstentwicklung)


zum formatting und code design: ich bin gegner von diversen richtlinien, vor allem die formatierung im java-style

function name(params) {
body
}

finde ich äußerst grauenhaft, das tut richtig weh beim code-lesen. nun werden mir aber wieder einige wiedersprechen und daher meine meinung: jeder wie er mag, solange der code leserlich ist, passts. daher mir bitte auch meine slash-balken, danke *-fg-*
eigengrau
Also nachdem die gebotenen Links keine guten Foren für Programmierer sondern für Programmiersprachen sind wurde der Thread hier etwas über Code. Mein Schwanz ist lang genug - brauch keinen Code um das auszugleichen.

Die Klammern-Regel von K&R hat ja einen einfachen Grund. Blöcke die ineinander verschachtelt werden können bekommen die öffnende Klammer in die gleiche Zeile wie die entsprechende Instruktion. Können sie nicht verschachtelt werden kommen sie in eine neue Zeile. Der einzige auf den das zutrifft sind Funktionen. Mein Code hält sich in jeder Sprache die { und } für Blöcke verwendet daran. Einzig mit Funktionen ist es nicht so einfach in PHP. Ich unterscheide Funktionen und Methoden. Nachdem Methoden in Klassendefinitionen geschrieben werden kommt hier die öffnende Klammer in die gleiche Zeile.

Der BSD-Style, also Klammern in eigene Zeilen (witzig dass FreeBSD aber K&R verwendet), ist mir nicht kompakt genug. Eine Funktion oder Methode kann schon 80 Zeilen haben (mit Kommentaren) und ich hätt gern die ganze Funktion am Schirm.

BTW wär BSD oder K&R komisch findet sollt sich mal Whitesmith oder Gnu-Style zur Gemüte führen.

QUELLTEXT
if(style)
 {
   do_kr();
 }
else
 {
   do_gnu();
 }


brrrrrr

b4n
Slavko Milosevic
ZITAT
Programs must be written for people to read, and only incidentally for machines to execute.
Abelson & Sussman, SICP, preface to the first edition
eigengrau
Wenn ein Neuling diesen Satz hört beginnet er den ganzen Source-Code mit Kommentaren voll zu stopfen und es wird dann sehr schwer dem Programm zu folgen. Es sollte lesbar sein für jemanden der die Sprache versteht.

QUELLTEXT
x = counter++; // weist derzeitigen Wert von counter an x zu und erhöht dann counter um 1


Das ist zwar dann sogar für jemanden lesbar, der nicht C kann - für mich wird der Code dann zur Kommentar-Wüste.

b4n
Slavko Milosevic
Was sich von selbst erklärt kommentiert doch keiner. Zu verstehen was eine einzelne Codezeile macht ist keine Kunst, man muss wissen was ihre Rolle im Ganzen ist...also habe ich nicht die Befürchtung durch Verbreitung dieses Zitats einen schwerwiegende pädagogische Fehler zu begehen...Abgesehen davon macht ne durchdachte Logik und Strukturierung ein Programm viel "lesbarer" als wenn mans mit comments zupflastert...

btw.
ZITAT
If I had a nickel for every time I've written "for (i = 0; i < N; i++)" in C I'd be a millionaire.
Mike Vanier
eigengrau
Vielleicht bin ich auch nur ein gebrandmarktes Kind weil ich in Informatik eine 2 bekommen hab weil ich nicht jede Zeile kommentiert hab, sondern lieber alles in sprechende Funktionen gepackt hab. Ach ...

BTW gegen for-schleifen gibt es meist schon foreach. Es leben die wirklichen Hochsprachen wink.gif Wobei das natürlich in einem Makro auch gegangen wäre. Aber C soll nicht einfach sondern schnell sein.

b4n
someone
smile.gif

lg an alle
Slavko Milosevic
tounge.gif Alt aber immer wieder gut. biggrin.gif
LEKI
ZITAT(tecxx @ 26. Aug 2004, 12:45 )
zum formatting und code design: ich bin gegner von diversen richtlinien, vor allem die formatierung im java-style

function name(params) {
body
}

finde ich äußerst grauenhaft, das tut richtig weh beim code-lesen.

bin zwar kein programmierheld, aber ein bißchen php scripten is drin....

ich find das auch fürchterlich und für mich total unleserlich... ich hab das am liebsten so stehen (so hat man uns das in der Schule anno dazumals in turbo C 2.0 beigebracht *G*
QUELLTEXT
If (irgendwas == 1)
{
 nochwas++;
 ....
}
Else
{
 nochwas--;
 ....
}
Slavko Milosevic
löl der geht auch:

ZITAT
* Source Code Windows 2000 */

#include "win31.h"
#include "win95.h"
#include "win98.h"
#include "workst~1.h"
#include "evenmore.h"
#include "oldstuff.h"
#include "billrulz.h"
#include "monopoly.h"
#include "backdoor.h"
#define INSTALL = HARD

char make_prog_look_big(16000000);
void main()
{
while(!CRASHED)
{
display_copyright_message();
display_bill_rules_message();
do_nothing_loop();

if (first_time_installation)
{
make_100_megabyte_swapfile();
do_nothing_loop();
totally_screw_up_HPFS_file_system();
search_and_destroy_the_rest_of-OS2();
make_futile_attempt_to_damage_Linux();
disable_Netscape();
disable_RealPlayer();
disable_Lotus_Products();
hang_system();
} //if
write_something(anything);
display_copyright_message();
do_nothing_loop();
do_some_stuff();

if (still_not_crashed)
{
display_copyright_message();
do_nothing_loop();
basically_run_windows_31();
do_nothing_loop();
} // if
} //while

if (detect_cache())
disable_cache();

if (fast_cpu())
{
set_wait_states(lots);
set_mouse(speed,very_slow);
set_mouse(action,jumpy);
set_mouse(reaction,sometimes);
} //if

/* printf("Welcome to Windows 3.1"); */
/* printf("Welcome to Windows 3.11"); */
/* printf("Welcome to Windows 95"); */
/* printf("Welcome to Windows NT 3.0"); */
/* printf("Welcome to Windows 98"); */
/* printf("Welcome to Windows NT 4.0"); */
printf("Welcome to Windows 2000");

if (system_ok())
crash(to_dos_prompt)
else
system_memory = open("a:\swp0001.swp",O_CREATE);

while(something)
{
sleep(5);
get_user_input();
sleep(5);
act_on_user_input();
sleep(5);
} // while
create_general_protection_fault();

} // main
Dieses ist eine vereinfachte Darstellung unseres Foreninhaltes. Um die detaillierte Vollansicht mit Formatierung und Bildern zu betrachten, bitte hier klicken.
Invision Power Board © 2001-2024 Invision Power Services, Inc.