Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo

Ich bin ziemlich die Abfängerin bei C++ und habe folgenden Code aufgeschrieben :

/* sparse Cholesky update/downdate, L*L' + sigma*w*w' (sigma = +1 or -1) */

int cs_updown (cs *L, int sigma, const cs *C, const int *parent)

{

int p, f, j, *Lp, *Li, *Cp, *Ci ;

double *Lx, *Cx, alpha, beta = 1, delta, gamma, w1, w2, *w, n, beta2 = 1 ;

if (!L || !C || !parent) return (0) ;

Lp = L->p ; Li = L->i ; Lx = L->x ; n = L->n ;

Cp = C->p ; Ci = C->i ; Cx = C->x ;

if ((p = Cp [0]) >= Cp [1]) return (1) ; /* return if C empty */

w = (int*)cs_malloc (n, sizeof (int)) ;

if (!w) return (0) ;

f = Ci [p] ;

for ( ; p < Cp [1] ; p++) f = CS_MIN (f, Ci [p]) ; /* f = min (find ©) */

for (j = f ; j != -1 ; j = parent [j]) w [j] = 0 ; /* clear workspace w */

for (p = Cp [0] ; p < Cp [1] ; p++) w [Ci [p]] = Cx [p] ; /* w = C */

for (j = f ; j != -1 ; j = parent [j]) /* walk path f up to root */

{

p = Lp [j] ;

alpha = w [j] / Lx [p] ; /* alpha = w(j) / L(j,j) */

beta2 = beta*beta + sigma*alpha*alpha ;

if (beta2 <= 0) break ; /* not positive definite */

beta2 = sqrt (beta2) ;

delta = (sigma > 0) ? (beta / beta2) : (beta2 / beta) ;

gamma = sigma * alpha / (beta2 * beta) ;

Lx [p] = delta * Lx [p] + ((sigma > 0) ? (gamma * w [j]) : 0) ;

beta = beta2 ;

for (p++ ; p < Lp [j+1] ; p++)

{

w1 = w [Li [p]] ;

w [Li [p]] = w2 = w1 - alpha * Lx [p] ;

Lx [p] = delta * Lx [p] + gamma * ((sigma > 0) ? w1 : w2) ;

}

}

cs_free (w) ;

return (beta2 > 0) ;

}

wobei die Zeile mit w = (int*)cs_malloc (n, sizeof (int)) , den Fehler C2440 verursacht

Kann mir jemand dabei einen Tipp geben?

LG

Geschrieben

da ich neu in Forum bin weiß nicht ganz genau wo ich Beiträge posten soll..Du meinst dass ich w = (double*)cs_malloc (n, sizeof (double)) schreiben soll?

Dies habe ich schon ausprobiert , der zeigt dann mehrere Fehlern

Wie könnte es sonst lösen?Hat jemand sonst eine Idee?

Geschrieben
Du meinst dass ich w = (double*)cs_malloc (n, sizeof (double)) schreiben soll?
Ich kann dir nicht sagen, was du schreiben sollst, weil ich nicht weiß, was der Code tun soll.

Der Code ist offensichtlich nicht von dir, sondern stammt aus der CSparse-Bibliothek, mit leichten Änderungen. Niemand hier weiß aber, ob die Änderungen am Code Absicht sind, und welches Ziel sie haben.

Dies habe ich schon ausprobiert , der zeigt dann mehrere Fehlern
Und welche das sind, sollen wir jetzt raten?

Warum denn überhaupt der Cast? cs_malloc gibt void* zurück, das sollte sich ohne Cast umwandeln lassen. Oder schickst du den Code durch einen C++-Compiler?

Wie könnte es sonst lösen?Hat jemand sonst eine Idee?
Was lösen? Was ist denn überhaupt das Problem?

Geht es dir nur darum, dass der Code fehlerfrei compiliert werden kann? Ist dir klar, dass er dann ziemlich sicher trotzdem nicht das tust, was du willst? Der Compiler meldet nur Fehler, wenn er den Code nicht übersetzen kann. Er kann nicht prüfen, ob der Code das tut, was du willst.

Und was du willst, hast du uns noch nicht gesagt.

Geschrieben

du hast Recht der Code ist nicht von mir, mir gehts nur darum dass der fehlerfrei funktioniert , ich muss nur die Ausgabe davon haben , das eigentliche Problem ist: ich müsste nun ein Programm in C++ schreiben der einen Matrix permutiert wie in matlab der dmperm macht..Deswegen habe ich die csparse.cpp und csparse.h mit dem code cs_permute Dateien versucht zusammen zu verknüpfen...

Es entstehen natürlich Fehler die ich nicht beheben könnte.Hast du vielleicht eine bessere Idee wie ich weiterkommen kann?

Geschrieben
kein malloc, new.
malloc gibt's auch in C++.

Es gibt nur wenige Dinge, die in C erlaubt, in C++ aber nicht erlaubt sind. Die implizite Konvertierung von void-Zeigern ist eins dieser Dinge.

dizem, du hast immer noch nicht gesagt, welche Fehler gemeldet werden, wenn du den Cast in (double*) änderst.

Geschrieben

Es gibt nur wenige Dinge, die in C erlaubt, in C++ aber nicht erlaubt sind. Die implizite Konvertierung von void-Zeigern ist eins dieser Dinge.

Eben deswegen.

Mein Unterbewusstsein verbietet mir den Rückgabewert von malloc zu casten. :floet:

(C oder C++, spielt dabei keine Rolle)

Nuja, Geschmackssache. new muss man wenigstens nicht casten.

Geschrieben

die fehlermeldung sagt dass

error C2440: '=': 'int *' kann nicht in 'double *' konvertiert werden kann..Ich komme nicht weiter...das ist der einzige Fehler ...wenn ich in int* schreibe dann meckert der zicht mal....

Geschrieben (bearbeitet)

mit dem code

w = (double*)cs_malloc(n, sizeof (double)) ;

if (!w) return (0) ;

Zeigt er folgende Fehler.

:\dokumente und einstellungen\admin\eigene dateien\visual studio 2008\projects\permute\permute\csparse.cpp(1922) : warning C4244: 'Argument': Konvertierung von 'double' in 'int', möglicher Datenverlust

Manifest in Ressourcen wird kompiliert...

Microsoft ® Windows ® Resource Compiler Version 6.1.6723.1

Copyright © Microsoft Corporation. All rights reserved.

Verknüpfen...

MSVCRTD.lib(crtexe.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_main" in Funktion "___tmainCRTStartup".

C:\Dokumente und Einstellungen\Admin\Eigene Dateien\Visual Studio 2008\Projects\permute\Debug\permute.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\Admin\Eigene Dateien\Visual Studio 2008\Projects\permute\permute\Debug\BuildLog.htm" gespeichert.

permute - 2 Fehler, 1 Warnung(en)

========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

Bearbeitet von dizem
Geschrieben

int p, f, j, *Lp, *Li, *Cp, *Ci ;

double *Lx, *Cx, alpha, beta = 1, delta, gamma, w1, w2, *w, n, beta2 = 1 ;

if (!L || !C || !parent) return (0) ;

Lp = L->p ; Li = L->i ; Lx = L->x ; n = L->n ;

Cp = C->p ; Ci = C->i ; Cx = C->x ;

if ((p = Cp [0]) >= Cp [1]) return (1) ; /* return if C empty */

w = (double*)cs_malloc(n, sizeof (double)) ;

if (!w) return (0) ;

f = Ci [p] ;

for ( ; p < Cp [1] ; p++) f = CS_MIN (f, Ci [p]) ; /* f = min (find ©) */

for (j = f ; j != -1 ; j = parent [j]) w [j] = 0 ; /* clear workspace w */

for (p = Cp [0] ; p < Cp [1] ; p++) w [Ci [p]] = Cx [p] ; /* w = C */

for (j = f ; j != -1 ; j = parent [j]) /* walk path f up to root */

{

p = Lp [j] ;

alpha = w [j] / Lx [p] ; /* alpha = w(j) / L(j,j) */

beta2 = beta*beta + sigma*alpha*alpha ;

if (beta2 <= 0) break ; /* not positive definite */

beta2 = sqrt (beta2) ;

delta = (sigma > 0) ? (beta / beta2) : (beta2 / beta) ;

gamma = sigma * alpha / (beta2 * beta) ;

Lx [p] = delta * Lx [p] + ((sigma > 0) ? (gamma * w [j]) : 0) ;

beta = beta2 ;

for (p++ ; p < Lp [j+1] ; p++)

{

w1 = w [Li [p]] ;

w [Li [p]] = w2 = w1 - alpha * Lx [p] ;

Lx [p] = delta * Lx [p] + gamma * ((sigma > 0) ? w1 : w2) ;

}

}

cs_free (w) ;

return (beta2 > 0) ;

}

JETZT habe ich nun einen Fehler mit dem Linker und zwar..

error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_main" in Funktion "___tmainCRTStartup" wieß nicht wie ich den beheben soll?Ich bin ziemlich die Anfängerin

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...