C言語
1#include "wakabalite.h" 2#include "gpa1.h" 3 4// gpa算出関数(単位数, MARK構造体ポインタ, 科目数) 5double get_gpa(int units, Mark *marks, int n){ 6 double gpSum = 0.0; 7 int i; 8 9 for(i=0;i<n;i++){ 10 gpSum += (double)(marks[i].score-54.5)*marks[i].unit/10; 11 } 12 return (double)gpSum/units; 13} 14 15int gpa1(pthread_t selfId, PGconn *con, int soc, char *recvBuf, char *sendBuf){ 16 PGresult *res, *resStd, *resSub, *resMrk, *resMrk2; // SQL実行結果 17 int resultRows, resultRows2, sendLen, i, n; 18 int stNum, units=0; 19 double gpa; 20 char *subCode; 21 char comm[BUFSIZE]; 22 char sql[BUFSIZE]; 23 char *sqlBegin="BEGIN", *sqlCommit="COMMIT", *sqlRollback="ROLLBACK"; 24 char userid[10]; 25 char year[10]; 26 char term[10]; 27 28 WakabaUser account; 29 Student student; 30 Mark marks[100]; 31 32 /* コマンド引数取得 */ 33 n = sscanf(recvBuf, "%s %s %s %s", comm, userid, year, term[0]); 34 if(n!=4){ 35 sprintf("%s %d%s", ER_STAT, E_CODE_2, ENTER); 36 return -1; 37 } 38 39 /*入力された学期を格納*/ 40 marks->term[0] = term[0]; 41 42 /* 学籍番号・科目コード・点数をとりだす*/ 43 sprintf(sql,"SELECT user_id,subject_code,score,year FROM marks WHERE user_id='%s' AND year='%s'", userid, year); 44 printf("[%s]\n",sql); 45 resStd = PQexec(con, sql); 46 if(PQresultStatus(resStd) != PGRES_TUPLES_OK){ 47 printf("%s\n", PQresultErrorMessage(resStd)); 48 sprintf("%s %d%s", ER_STAT, E_CODE_4, ENTER); 49 return -1; 50 } 51 resultRows = PQntuples(resStd); 52 if(resultRows != 1){ 53 sprintf("%s %d%s", ER_STAT, E_CODE_1, ENTER); 54 return -1; 55 } 56 57 // 学生・成績オブジェクトに各値を代入 58 for(i=0; i<resultRows; i++){ 59 strcpy(student.userId,PQgetvalue(resStd, i, 0)); 60 strcpy(marks[i].subCode,PQgetvalue(resStd, i, 1)); 61 marks[i].score = atoi(PQgetvalue(res, i, 2)); 62 strcpy(marks[i].year,PQgetvalue(resStd, i, 3)); 63 } 64 65 // 単位数を取得(科目コードから) 66 sprintf(sql, "SELECT subject_code,unit_number,term FROM subject_t WHERE subject_code = 'marks->subCode' term = 'marks->term[0]'"); 67 68 printf("[%s]\n",sql); 69 resMrk = PQexec(con, sql); 70 if(PQresultStatus(resMrk) != PGRES_TUPLES_OK){ 71 printf("%s\n", PQresultErrorMessage(resMrk)); 72 sprintf("%s %d%s", ER_STAT, E_CODE_4, ENTER); 73 return -1; 74 } 75 resultRows = PQntuples(resMrk); 76 77 for(i=0;i<resultRows;i++){ 78 marks[i].unit = atoi(PQgetvalue(res, i, 1)); 79 80 // 単位数カウント 81 units += marks[i].unit; 82 } 83 84 // GPA算出 85 gpa = get_gpa(units,marks,resultRows); 86 87 // レスポンス送信 88 sendLen = sprintf(sendBuf,"units:%d GPA:%f%s", units, gpa, ENTER); 89 send(soc, sendBuf, sendLen, 0); 90 printf("[C_THREAD %ld] SEND=> %s", selfId, sendBuf); 91 92 return 0; 93}
ーー追記ーー
makeコマンドを使い、以下のファイルを一気にコンパイルしました。
$make gcc wakabalite_server_main.o setup_listen.o wakabalite_controller.o common_func.o get_mark_clerk_func.h mark_divi.o gpa1.o -lpq -lpthread -o wakabalite_s
サーバーに接続してプロトコルコマンドを入力し、挙動を確認。
[C_THREAD 140385380718336] WAKABALITE CONTROLLER START (4) [C_THREAD 140385380718336] RECV=> GPA 66660320 2020 前期 [SELECT user_id,subject_code,score,year FROM marks WHERE user_id='66660320' AND year='2020'] Segmentation fault
コマンドプロンプトで実行したところ、セグメンテーションフォルトが出力されます。
どこがおかしいか教えていただけませんか?
回答3件
あなたの回答
tips
プレビュー