- 1 名前:デフォルトの名無しさん [2010/04/10(土) 23:30:23 BE:454421186-S★(520172)]
- C言語の*入門者*向け解説スレッドです。
★前スレ C言語なら俺に聞け(入門編)Part 62 pc12.2ch.net/test/read.cgi/tech/1269517734/ ★過去スレ makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000 ★初心者、初級者の方は他の質問スレのほうが良いかもしれません。 例えば 【初心者歓迎】C/C++室 Ver.72【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1267775473/ とか ★教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題片付けます 135代目 pc12.2ch.net/test/read.cgi/tech/1269438098/ ★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ ★分からない事をなるべく詳しく書いて下さい。 ★ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ★開発環境や動作環境も晒すと答えが早いかもしれません。 ★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
- 858 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 17:49:22 ]
- >>857
アルファベットの文字コードのことなんだけどね。 char c = 'A'; という構文はわかる? そして c = c +1; putchar(c); とすると画面には B と表示されるんだけど・・・
- 859 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 18:03:43 ]
- >>857
アスキーコードでググれ どのアルファベットがどの数字に割り当たってるのかわかるし 順番に並んでるのを見れば理解も早い
- 860 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 18:08:33 ]
- いろいろな操作を行って、例えばABCD\0が入っている文字配列Z[5]を
空にする(宣言直後の状態に戻す)方法はありますか? 例えばループ中で代入しようとするとエラーを吐いてしまいます。 まだかなり初心者だと思いますが、よろしくお願いします。
- 861 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 18:13:04 ]
- >>860
とりあえず、君が書いたコードを貼れよ あと宣言直後は空でなく、デタラメな文字が入ってるよ。
- 862 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 18:28:58 ]
- >>860
memset( Z, 0x00, sizeof( Z ) );
- 863 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 18:29:58 ]
- >>860
for(i=0;i<=5;i++)としてないかな? 添え字は0から始まるので要素数5の場合は for(i=0;i<5;i++)として0〜4の範囲を指定せねばいかんよ。 初期化の方法は Cならmemset WinAPIならZeroMemory C++ならstd::fill 使い回さずにその都度宣言した方がいいと思う
- 864 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 18:31:35 ]
- 宣言直後に入っている文字列を別の配列にコピーしておいてあとでコピーしなおせばいいんじゃないの?何がしたいのか分からんが。
- 865 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 18:39:44 ]
- >>860
*z = '\0';
- 866 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 20:21:33 ]
- >>865
君は C プログラマには向いてないから BASIC 等をやったほうが良いんじゃないかな。
- 867 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 20:57:13 ]
- >>866
なんだって
- 868 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 22:16:02 ]
- シューティングゲーム作ってるんですが、int型とdouble型では
どちらのほうが計算速度が速いですか?
- 869 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 22:17:23 ]
- double型。
- 870 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 22:21:20 ]
- >>869
ありがとう!
- 871 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 22:22:40 ]
- んなわけないだろ。
- 872 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 23:03:44 ]
- いやdouble型早いから
- 873 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 23:16:39 ]
- 今時のCPUならほとんど変わらない、まぁ、実測が基本
intからdoubleとかdoubleからintへの変換が多くあると急激に遅くなる がんばって、固定小数にしてもそれほど早くもならなかったので、浮動小数でいいやとなった これ以上速くしようと思ったらアルゴリズム改良するかGPUに支援してもらうか、はぁ
- 874 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 23:44:15 ]
- VIA の CPU なら整数演算でないと激遅
- 875 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 23:48:05 ]
- 浮動小数点型はCPUによって微妙に数値誤差の出方が変わるので
リプレイ機能と相性が悪い聞く事がある 同じIntel系同士でもそうなるのかは俺は知らない
- 876 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 23:49:50 ]
- 使う命令を切り替える実装を使うな
- 877 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 23:56:58 ]
- アセンブラでCPUの拡張命令(SSEとか3D Now!!)を叩くしかない。
- 878 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 00:11:57 ]
- WINAPIのwsprintfでは実数が扱えなかったので、
sprintfを使いました。 そこからWINAPIのTextOut等で、ウィンドウに文字を表示したいのですが、 char *型からLPCWSTRへの変換が出来ないのでエラーになります。 何かいい方法ありませんか?
- 879 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 00:22:21 ]
- mbstowcsって言えばいいのかな?
- 880 名前:デフォルトの名無しさん [2010/05/12(水) 00:41:05 ]
- >>858
char型って整数の範囲決まってませんでした?じゃぁnが大きいと 計算できないんじゃ?Aは65ってこと? プログラムにはアルファベットとnを入力させるように作るのですか?・・ 初心者に見せかけて相当理解力が弱いんで優しくしてください・・ まじわからんww
- 881 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 00:47:53 ]
- 文字コードってのがあんだよ。
コンピューターは01しか理解できないから文字も01に変換して処理させてるわけ。
- 882 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 00:54:44 ]
- >>878
tchar.hをインクルードして_stprintf使え。 これでcharではなく、Windows APIのTCHARが使える(正確には、ちと違うが)。
- 883 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 00:55:21 ]
- >>878
TextOutA()
- 884 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 00:56:04 ]
- ASCIIコード表を見るといいと思うよ。
- 885 名前:デフォルトの名無しさん [2010/05/12(水) 00:56:55 ]
- >>881
文字コードは01じゃないけどな。
- 886 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 01:00:07 ]
- 2進数に直したら全部01だろ馬鹿か
- 887 名前:デフォルトの名無しさん [2010/05/12(水) 01:00:51 ]
- 直すからだろw
- 888 名前:デフォルトの名無しさん [2010/05/12(水) 01:01:49 ]
- >>1
山手線符号化したら、全部駅名だろwwアホww
- 889 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 01:32:15 ]
- >>888
もしよろしければどこへの誤爆かおしえていただきたいのですがいかがですかね
- 890 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 01:41:51 ]
- >>882
TCHAR の意味解ってないだろ。 >>884 ASCII とは限らないだろ。
- 891 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 01:49:13 ]
- TCHAR?
ティーチャーって先生って意味ですよね。
- 892 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 07:40:39 ]
- >>880
文字コードの文字のところ一部抜粋。 #include <stdio.h> int main(void) { int i; for (i=61;i<123;i++) { printf("%c(%3d) ",i,i); if((!(i%10))||(i==122))printf("\n"); } return 0; }
- 893 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 08:03:20 ]
- >>882
_stprintfから、swprintfの存在を知り、問題なく実数でも扱えて 処理できました。 ありがとう!
- 894 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 08:31:06 ]
- 文字コード云々じゃなくてさ、問題の意味がわからないって質問だろ?
アルファベットにアルファベットを足すとか言ってるし、「整数 n」←このnをアルファベットだと思ってるんじゃないの? 入力されたアルファベットにnというアルファベットを足すってどういう意味って聞いてるんじゃないの?
- 895 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 08:58:14 ]
- 初心者質問していい?
- 896 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 09:02:10 ]
- だめ
- 897 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 09:51:53 ]
- >>895
どうぞ。 >>894 >「整数 n」←このnをアルファベットだと思ってるんじゃないの? その発想はなかったw
- 898 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 12:11:13 ]
- どうも元質問者は VBからの移行なのか variant型 が当然のようで
変数 a に 文字の '1' を与える → 整数演算の時 値として 1 に評価される という思考から抜け出せないでいるようだ
- 899 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 13:46:27 ]
- PHPとかその辺混乱しまくりw
- 900 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 15:29:52 ]
- いつの話してんだ
- 901 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 18:57:08 ]
- VC++2008を使っています.
画像を入れる配列を3つに増やそうとすると 'System.StackOverflowException' のハンドルされていない例外が ○○.exe で発生しました。 とエラーがでてしまいます.少し調べたところ,unsigned charしすぎて回帰の回数が増えたためなのかと思ったんですが,どうしても配列を3つ以上使いたいのですがあきらめるしかないのでしょうか? 以下エラーの原因と思われるソースの一部です.(main.cpp) FILE *fp; unsigned char header[54]; unsigned char screen[400][300][3];//読み込み用 unsigned char screenB[400][300][3];//保存用 unsigned char screenG[400][300][3];//保存用 //ここをコメントアウトしたらエラー消える //unsigned char screenR[400][300][3];//保存用 /* 画像サイズ */ int yl=400;//y_long //呼び出し履歴によるとここでデバッグが止まる int xl=300;//x_long /* ファイルから読む */ fp=fopen("test.bmp","rb"); /* Windowsビットマップ形式 400*300ピクセル,24ビットカラー */ fread(header,1,54,fp); /* ヘッダ(54バイト)を飛ばす */ fread(screen,1,yl*xl*3,fp); /* 残りはデータ(最下行から順に入る) */ //fread(screenB,1,yl*xl*3,fp); fclose(fp);
- 902 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 19:01:11 ]
- スタックがあふれるならヒープに取ればいいじゃない、ということで、
mallocとか使って動的にメモリを確保するんです。 多分その段階だとポインタになれてないだろうから、がんばれ、とエールを。
- 903 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 19:05:58 ]
- 取り敢えず、スタックの割り当てを増やすのも手かと。
- 904 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 19:09:29 ]
- 適当にテストするならグローバルにすればよころう。
- 905 名前:901 mailto:sage [2010/05/12(水) 19:13:58 ]
- >>902
ありがとうございます. もう一度調べなおしてみます.
- 906 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 20:06:33 ]
- >>901
>editbin /stack:1000000 とかやっとけば OK
- 907 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 20:38:04 ]
- >>906
なんでそんなひどいこというの?
- 908 名前:デフォルトの名無しさん [2010/05/12(水) 21:43:28 ]
- >>894
質問したものですが さすがにそれはないです。このスレでも意見分かれてませんか? nをたくさんたすとzまでいってまたaに戻るとか。 アルファベトに数値をたすって意味が分からないんですよ。 たとえばAに1000足したら? Aとはそもそも何か、16進数の10番目のやつか、何ちゃら 規格とかのコードなのか。それが分かりません
- 909 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 21:50:49 ]
- てst
- 910 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 21:55:19 ]
- >>908
> アルファベトに数値をたすって意味が分からないんですよ。 'A' は0x41や65の別表現でしかない。('A'==0x41==65) 全て内部的にはただの数値。 'A'+1==0x42==66=='B'
- 911 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 21:55:20 ]
- アルファベットに数字を足す問題ですが、
クラスの友達に聞いて解決しました。 ここの人たちは理解力がなさすぎだと思います
- 912 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 21:56:26 ]
- >>908
'a'+1='b' これならわかる?
- 913 名前:デフォルトの名無しさん [2010/05/12(水) 21:57:59 ]
- >>908
ja.wikipedia.org/wiki/ASCII ここを読めば文字「A」が65に対応してることがわかるとおもうよ。
- 914 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 22:01:28 ]
- まぁ、普通はアルファベットに数値を足すと聞いたらアルファベットを並べて何文字か後のことだ。なんて思わない罠。
- 915 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 22:58:04 ]
- C言語初心者です。入力した整数の数だけ*を表示したいんですが、
エラー続きです。どこをどう直せばいいか教えて下さい。 #include <stdio.h> int f(int); int main(void) { int no; printf("整数を入力:"); scanf("%d",&no); return 0; } void(int n) { while (n-->0) putchar('*'); putchar('\n'); }
- 916 名前:デフォルトの名無しさん [2010/05/12(水) 23:01:23 ]
- #include <stdio.h>
int f(int); int main(void) { int no; printf("整数を入力:"); scanf("%d",&no); func(no); //☆ return 0; } void func(int n) //☆ { while (n-->0) putchar('*'); putchar('\n'); }
- 917 名前:デフォルトの名無しさん [2010/05/12(水) 23:02:57 ]
- ×func
○f
- 918 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 23:37:56 ]
- プロトタイプ宣言と定義で戻り値の型が喰い違っている。
- 919 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 01:18:41 ]
- >>915
#include <stdio.h> #include <ctype.h> /* function prototype */ void disp_char( int ); int main( void ) { char no; printf( "整数を入力してください:" ); scanf( "%c", &no ); if( isdigit( no ) == 0 ) { printf( "Error:数値以外の文字が入力されました\n" ); } else { disp_char( no - '0' ); } return 0; } void disp_char( int t ) { int i; char c = '*'; for( i = 1; i <= t; i++ ) { printf( "%c", c ); } printf( "\n" ); }
- 920 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 02:30:42 ]
- >>908
もっと単純に考えたら? Aの次のアルファベットって何?って聞かれたら困るのかな。そういうレベルよ。 Hの3つ前のアルファベットは? で、zの次は何?って聞かれた時に、 ・ないわー ・最初に戻ってa ・小文字終わったからA とするか、そこは問題に明記されてないから、あなたが決めなきゃならないという話
- 921 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 02:31:23 ]
- 解決してタワーorz
- 922 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 03:55:38 ]
- 成りすましにマジレスしなくてもw
- 923 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 09:44:49 ]
- Cでプログラム組んでます。
ファイルの扱い方で質問があります。 fopen、fread、fwrite、fseek、fclose でファイルの読み込みや書き込みを行っているのですが あるファイルを読み書き可能状態でfopenして 10バイトfwiteしたあと、fcloseせずに 書いたデータをファイルの最後から1バイトずつfseekして freadして、その1バイトが特定の条件に一致した場合に そこまで読み込んだデータを破棄して 10-fseekしたバイト数だけのファイルを作りたいのですが そんなこと可能なのでしょうか? fwiteする前に書き込みデータをチェックしたかったのですが その部分には手を入れられないため、 1度書き込んだファイルの途中をぶった切れるのかが知りたいです。 ■■■■■■■□□□ □を破棄して、■だけのデータを作りたいというようなイメージです。
- 924 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 09:55:29 ]
- chsize
- 925 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 09:56:49 ]
- >>923
ftruncate()が使えればできなくはないが、事情が許すなら別ファイルに書き出すのが無難。
- 926 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 10:00:44 ]
- >>923
fclose()した後に切り詰めたいなら>924かtruncate()、開いたまま切り詰めたいならftruncate()。 但し、後者はファイルハンドルをfileno()で取得する必要あり。
- 927 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 17:53:32 ]
- フィボナッチ数列を出力するプログラムを書いたのですが
どうもうまく動きません どうすればいいでしょうか #include<stdio.h> #include<stdlib.h> #define TERM 30 int main(void){ int fivo=0,n=0,temp; FILE *fp; fp=fopen("fivo.txt","wt"); if(fp==NULL){ fprintf(stderr,"ファイルオープンエラー"); exit(1); } while(fivo<=TERM){ if(fivo==1||fivo==2)n=1; fprintf(fp,"F(%2d)=%10d\n",fivo,n); fivo++; temp=n; n+=temp; } fclose(fp); printf("正常に終了しました\nfivo.txtに保存しました"); return 0; }
|

|