前提・実現したいこと
C言語を学習している初心者です。
スタックを利用するプログラムmain.c(「該当のソースコード」に掲載)を作成しました。
作成環境はVisual Studio Codeです。
このプログラムは市販参考書に掲載されているものなので間違いはないと思います。
しかし、次のようにコンパイルするとエラーメッセージ(「ターミナル画面」に掲載)が出てしまいます。
何が原因で、どうすれば実行できるのか教えて頂きたいです。
また、自作ヘッダファイルにおいて、IntStack.hとIntStack.cのコンパイルの順番はあるのでしょうか。
宜しくお願い致します。
ターミナル画面
※以下、パソコンのユーザー名を隠すため、ユーザー名の部分を***に置き換えました。
PS C:\Users***\Documents\program1> gcc .\IntStack.h PS C:\Users***\Documents\program1> gcc .\IntStack.c c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../libmingw32.a(main.o):(.text.startup+0xc0): undefined reference to `WinMain@16' collect2.exe: error: ld returned 1 exit status PS C:\Users***\Documents\program1> gcc .\main.c c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0x1f): undefined reference to `Initialize' c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0x46): undefined reference to `Capacity' c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0x54): undefined reference to `Size' c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0x9c): undefined reference to `Terminate' c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0xec): undefined reference to `Push' c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0x11a): undefined reference to `Pop' c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0x15d): undefined reference to `Peek' c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0x198): undefined reference to `Print' c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0x1d1): undefined reference to `Search' c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0x203): undefined reference to `Search' c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0x221): undefined reference to `IsEmpty' c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0x24e): undefined reference to `IsFull' collect2.exe: error: ld returned 1 exit status
該当のソースコード
C
1/*IntStack.h*/ 2#ifndef ___IntStack 3#define ___IntStack 4 5typedef struct{ 6 int max; 7 int ptr; 8 int *stk; 9}IntStack; 10 11int Initialize(IntStack *s, int max); 12int Push(IntStack *s, int x); 13int Pop(IntStack *s, int *x); 14int Peek(const IntStack *s, int *x); 15void Clear(IntStack *s); 16int Capacity(const IntStack *s); 17int Size(const IntStack *s); 18int IsEmpty(const IntStack *s); 19int IsFull(const IntStack *s); 20int Search(const IntStack *s, int x); 21void Print(const IntStack *s); 22void Terminate(IntStack *s); 23 24#endif 25 26 27/*IntStack.c*/ 28#include <stdio.h> 29#include <stdlib.h> 30#include "IntStack.h" 31 32int Initialize(IntStack *s, int max){ 33 s->ptr = 0; 34 s->stk = calloc(max, sizeof(int)); 35 if(s->stk == NULL){ 36 s->max = 0; 37 return -1; 38 } 39 s->max = max; 40 return 0; 41} 42 43int Push(IntStack *s, int x){ 44 if(s->ptr >= s->max) return -1; 45 s->stk[s->ptr++] = x; 46 return 0; 47} 48 49int Pop(IntStack *s, int *x){ 50 if(s->ptr <= 0) return -1; 51 *x = s->stk[--s->ptr]; 52 return 0; 53} 54 55int Peek(const IntStack *s, int *x){ 56 if(s->ptr <= 0) return -1; 57 *x = s->stk[s->ptr - 1]; 58 return 0; 59} 60 61void Clear(IntStack *s){ 62 s->ptr = 0; 63} 64 65int Capacity(const IntStack *s){ 66 return s->max; 67} 68 69int Size(const IntStack *s){ 70 return s->ptr; 71} 72 73int IsEmpty(const IntStack *s){ 74 return s->ptr <= 0; 75} 76 77int IsFull(const IntStack *s){ 78 return s->ptr >= s->max; 79} 80 81int Search(const IntStack *s, int x){ 82 int i; 83 for(i=s->ptr-1; i>=0; i--){ 84 if(s->stk[i] == x) return i; 85 } 86 return -1; 87} 88 89void Print(const IntStack *s){ 90 int i; 91 for(i=0; i<s->ptr; i++){ 92 printf("%d ", s->stk[i]); 93 } 94} 95 96void Terminate(IntStack *s){ 97 if(s->stk != NULL) free(s->stk); 98 s->ptr = 0; 99 s->max = 0; 100} 101 102 103/*main.c*/ 104#include <stdio.h> 105#include "IntStack.h" 106 107int main(){ 108 IntStack s; 109 if(Initialize(&s, 64) == -1){ 110 printf("creating stack: failure"); 111 return 1; 112 } 113 while(1){ 114 int menu, x; 115 printf("amount of data:%d / %d\n", Size(&s), Capacity(&s)); 116 printf("1.push 2.pop 3.peek 4.print 5.search 6.empty? 7.full? 0.end:"); 117 scanf("%d", &menu); 118 if(menu == 0) break; 119 switch(menu){ 120 case 1: 121 printf("input data:"); 122 scanf("%d", &x); 123 if(Push(&s, x) == -1) printf("\apush failure\n"); 124 break; 125 case 2: 126 if(Pop(&s, &x) == -1) printf("\apop failure\n"); 127 else printf("popped data: %d\n", x); 128 break; 129 case 3: 130 if(Peek(&s, &x) == -1) printf("\apeek failure\n"); 131 else printf("peeked data: %d\n", x); 132 break; 133 case 4: 134 Print(&s); 135 break; 136 case 5: 137 printf("What number do you want to search? : "); 138 scanf("%d", &x); 139 if(Search(&s, x) == -1) printf("\a%d doesn't exist.\n", x); 140 else printf("%d is at stack[%d]\n", Search(&s, x)); 141 break; 142 case 6: 143 IsEmpty(&s) == 1 ? printf("The stack is empty.\n") : printf("The stack is not empty.\n"); 144 break; 145 case 7: 146 IsFull(&s) == 1 ? printf("The stack is full.\n") : printf("The stack is not full.\n"); 147 break; 148 } 149 } 150 Terminate(&s); 151 return 0; 152} 153
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/08/12 09:09