コンテンツにスキップ
メインメニュー
メインメニュー
サイドバーに移動
非表示
案内
メインページ
最近の更新
未作成ページ
おまかせ表示
ヘルプ
MonoBook
検索
検索
ログイン
個人用ツール
ログイン
ログアウトした編集者のページ
もっと詳しく
投稿記録
トーク
「
Out of memory
」を編集中
ページ
議論
日本語
閲覧
編集
ソースを編集
履歴表示
ツール
ツール
サイドバーに移動
非表示
操作
閲覧
編集
ソースを編集
履歴表示
全般
リンク元
関連ページの更新状況
特別ページ
ページ情報
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。
スパム攻撃防止用のチェックです。 けっして、ここには、値の入力は
しない
でください!
{{小文字}}'''out of memory'''とは、[[黒歴史]]である[[LSI C-86 試食版]]の[[わがまま]]の一つである。 ==概要== 詳細な発生条件は不明だが、[[ソースコード]]の長さが関係している可能性がある。 ==再現例== ここに示した方法は、[[環境依存]]かもしれない。 1.LSI C-86 試食版を入手し、初期設定を行う<br /> LSI C-86 試食版は[http://www.vector.co.jp/soft/maker/lsi/se001169.html Vectorから入手]できる。 2.次のコードをtxedit.cとして適当なフォルダに保存する <source lang="c"> #include <stdio.h> #include <stdlib.h> #include <string.h> long strnum(char*); int main(void) { FILE *file; char* naiyou; char* edit; char cmd[10000]; char content[10000]; char filename[10000]; long line; size_t size; long nowline; char* now; char command[10000]; naiyou=calloc(1,1); while(1) { printf("command>"); fgets(command,10000,stdin); now=strpbrk(command," "); memset(content,0,10000); line=0; if(now==NULL) { now=strpbrk(command,"\n"); *now=0; strcpy(cmd,command); } else { memcpy(cmd,command,now-command); cmd[now-command]=0; command[strlen(command)-1]=0; if(*(now+1)=='\"') { edit=strpbrk(now+2,"\""); if(edit==NULL)edit=command+strlen(command)-1; else { if(*(edit+1)==32)line=atol(edit+2); } memcpy(content,now+2,edit-now-2); } else { edit=strpbrk(now+1," "); if(edit==NULL)edit=command+strlen(command); else { line=atol(edit+1); } memcpy(content,now+1,edit-now-1); } } switch(strnum(cmd)) { case 93:/*new*/ if(naiyou!=NULL)free(naiyou); naiyou=calloc(1,1); printf("成功\n"); break; case 118:/*open*/ file=fopen(content,"r"); if(file==NULL) { printf("error:ファイルオープンに失敗\n"); } else { strcpy(filename,content); fseek(file,0,SEEK_END); size=ftell(file); if(naiyou!=NULL)free(naiyou); naiyou=calloc(size+1,1); fseek(file,0,SEEK_SET); fread(naiyou,size,1,file); fclose(file); printf("成功\n"); } break; case 107:/*save*/ file=fopen(content,"w"); if(file==NULL) { printf("error:ファイルオープンに失敗\n"); } else { strcpy(filename,content); fwrite(naiyou,strlen(naiyou),1,file); fclose(file); printf("成功\n"); } break; #ifdef CAUSE_OOM case 199:/*update*/ file=fopen(filename,"w"); if(file==NULL) { printf("error:ファイルオープンに失敗\n"); } else { fwrite(naiyou,strlen(naiyou),1,file); fclose(file); printf("成功\n"); } break; case 380:/*showfile*/ printf("%s\n",filename); break; #endif case 200:/*delete*/ line=atol(content); case 21:/*add*/ case 89:/*set*/ edit=calloc(strlen(naiyou)+strlen(content)+3,1); if(line<=0 || (line==1 && strlen(naiyou)==0)) { if(strnum(cmd)==21) { strcpy(edit,naiyou); if(strlen(naiyou)>0)strcat(edit,"\n"); strcat(edit,content); printf("成功\n"); } else { strcpy(edit,naiyou); printf("error:そんな行はありません\n"); } } else { now=naiyou-1; for(nowline=0;nowline<line-1;nowline++) { now=strpbrk(now+1,"\n"); if(now==NULL) { strcpy(edit,naiyou); printf("error:そんな行はありません\n"); nowline=-1; break; } } if(now==naiyou-1)now=naiyou; if(nowline!=-1) { memcpy(edit,naiyou,now-naiyou); if(strnum(cmd)!=200) { if(now!=naiyou)strcat(edit,"\n"); strcat(edit,content); if(now==naiyou)strcat(edit,"\n"); } if(strnum(cmd)!=21)now=strpbrk(now+1,"\n"); if(now!=NULL)strcat(edit,now); printf("成功\n"); } } free(naiyou); naiyou=calloc(strlen(edit)+1,1); strcpy(naiyou,edit); free(edit); break; case 172:/*show*/ line=atol(content); if(line<=0) { printf("error:そんな行はありません\n"); } else { now=naiyou-1; for(nowline=0;nowline<line-1;nowline++) { now=strpbrk(now+1,"\n"); if(now==NULL) { printf("error:そんな行はありません\n"); nowline=-1; break; } } if(nowline!=-1) { edit=strpbrk(now+1,"\n"); if(edit==NULL)edit=naiyou+strlen(naiyou); memcpy(cmd,now+1,edit-now-1); cmd[edit-now-1]=0; printf("%s\n",cmd); } } break; case 160:/*exit*/ free(naiyou); exit(0); default: printf("error:コマンドが不正です\n"); } } return 0; } long strnum(char* str) { long num; long i; char temp; num=0; for(i=0;i<strlen(str);i++) { temp=str[i]-64; if(temp>=33)temp-=32; num+=temp*(i+1); } return num; } </source> これは[[テキスト]]を編集できる[[ラインエディタ]]の[[プログラム]]だが、そんなことは今はどうでもいい。 3.[[コンパイル]]する <pre>lcc txedit.c</pre>としてコンパイルすると通り、[[実行形式ファイル]]が生成されるが、 <pre>lcc -DCAUSE_OOM txedit.c</pre>としてコンパイルするとout of memoryが出力される。 ==関連項目== * [[LSI C-86 試食版]] * [[コンパイルエラー]]
編集内容の要約:
MonoBookへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MonoBook:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の確認用の質問に回答してください (
詳細
):
1たす1は?(全角で入力してください)
キャンセル
編集の仕方
(新しいウィンドウで開きます)
このページで使用されているテンプレート:
テンプレート:小文字
(
編集
)
本文の横幅制限を有効化/無効化