Browse Source

resask.c: avoid segfault if @R[i] is asked before analysis is run

h_vogt 14 years ago
parent
commit
417d109764
  1. 23
      src/spicelib/devices/res/resask.c

23
src/spicelib/devices/res/resask.c

@ -139,28 +139,43 @@ RESask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value,
errRtn = "RESask"; errRtn = "RESask";
strcpy(errMsg, msg); strcpy(errMsg, msg);
return(E_ASKCURRENT); return(E_ASKCURRENT);
} else {
} else if (ckt->CKTrhsOld) {
value->rValue = (*(ckt->CKTrhsOld + fast->RESposNode) - value->rValue = (*(ckt->CKTrhsOld + fast->RESposNode) -
*(ckt->CKTrhsOld + fast->RESnegNode)) *(ckt->CKTrhsOld + fast->RESnegNode))
*fast->RESconduct; *fast->RESconduct;
value->rValue *= fast->RESm; value->rValue *= fast->RESm;
return(OK);
} else {
char msgloc[BSIZE_SP];
sprintf(msgloc, "No current values available for %s", fast->RESname);
errMsg = TMALLOC(char, strlen(msgloc) + 1);
errRtn = "RESask";
strcpy(errMsg, msgloc);
return(E_ASKCURRENT);
} }
return(OK);
case RES_POWER: case RES_POWER:
if (ckt->CKTcurrentAnalysis & DOING_AC) { if (ckt->CKTcurrentAnalysis & DOING_AC) {
errMsg = TMALLOC(char, strlen(msg) + 1); errMsg = TMALLOC(char, strlen(msg) + 1);
errRtn = "RESask"; errRtn = "RESask";
strcpy(errMsg, msg); strcpy(errMsg, msg);
return(E_ASKPOWER); return(E_ASKPOWER);
} else {
} else if (ckt->CKTrhsOld) {
value->rValue = (*(ckt->CKTrhsOld + fast->RESposNode) - value->rValue = (*(ckt->CKTrhsOld + fast->RESposNode) -
*(ckt->CKTrhsOld + fast->RESnegNode)) * *(ckt->CKTrhsOld + fast->RESnegNode)) *
fast->RESconduct * fast->RESconduct *
(*(ckt->CKTrhsOld + fast->RESposNode) - (*(ckt->CKTrhsOld + fast->RESposNode) -
*(ckt->CKTrhsOld + fast->RESnegNode)); *(ckt->CKTrhsOld + fast->RESnegNode));
value->rValue *= fast->RESm; value->rValue *= fast->RESm;
return(OK);
} else {
char msgloc[BSIZE_SP];
sprintf(msgloc, "No power values available for %s", fast->RESname);
errMsg = TMALLOC(char, strlen(msgloc) + 1);
errRtn = "RESask";
strcpy(errMsg, msgloc);
return(E_ASKCURRENT);
} }
return(OK);
default: default:
return(E_BADPARM); return(E_BADPARM);
} }

Loading…
Cancel
Save