C言語なら俺に聞け(入門編)Part 63at TECH
C言語なら俺に聞け(入門編)Part 63 - 暇つぶし2ch833:デフォルトの名無しさん
10/05/11 02:39:06
>>827
> ファイルポインタを先頭に置いているときは、
> ftellの結果は 1 と出てくるのが妥当ではないかと感じるのですが

ファイルアドレスは 0 から始まるので、ファイルポインタが先頭、つまり
0 バイト目にある時は ftell() の結果は 0 と出るのが妥当です。
ファイルサイズ 0 の場合に fseek(fp, 0, SEEK_END) した時、ftell() が 1 を
返すのは妥当ではないと感じませんか?
ファイルサイズ 1 の場合に fseek(fp, 0, SEEK_END) した時、ftell() が 2 を
返すのは妥当ではないと感じませんか?

> fseek(fp, 195768, SEEK_SET) と
>  fseek(fp, 0, SEEK_END)
> が一致するなら、データが 195769 個あるように思うため)

いきなり 195768 のように大きなアドレスを扱うから混乱します。
まずファイルサイズ 0 の場合を考えてみてください。
fseek(fp, 0, SEEK_SET) ないし fseek(fp, 0, SEEK_END) をしてもファイル
ポインタは先頭、つまり 0 バイト目を指したままですが、そこに 1 個目の
データが存在すると思いますか?
いいえ、存在しません。

同様に、ファイルサイズ 195768 の場合、fseek(fp, 195768, SEEK_SET)
ないし fseek(fp, 0, SEEK_END) をしてもファイルポインタは 195768 バイト
目を指しますが、そこに 195769 個目のデータが存在すると思いますか?
ファイルサイズ 195768 なのに、最後の 1 バイトのデータはどこから来る
のでしょう?
いいえ、どこからも来ません。データは 195768 個しかありません。

ファイルポインタが指している場所に必ずしもデータが存在するとは限り
ません。

834:デフォルトの名無しさん
10/05/11 03:45:02
コンソールに計算式(例:34+4)を入力して演算結果を出力するプログラムを作っています。
作ってみたのですが、足し算しかうまくいきません。
どこが違ってるのかよくわからないのでアドバイスください。

URLリンク(kansai2channeler.hp.infoseek.co.jp)


835:デフォルトの名無しさん
10/05/11 04:07:50
>>834
if(p!=NULL){
b = atoi(p + 1);
printf("%d + %d = %d\n", a,b,a+b);
} else if(q!=NULL) {
c = atoi(q + 1);
printf("%d - %d = %d\n", a,c,a-c);
} else if(r!=NULL){
d = atoi(r + 1);
printf("%d * %d = %d\n", a,d,a*d);
} else if(s!=NULL){
e = atoi(s + 1);
printf("%d / %d = %d\n", a,e,a/e);
}

836:デフォルトの名無しさん
10/05/11 04:38:18
なんでb, c, d, eを分けてるの?
ch1, ch2, ch3, ch4は何の意味があるの?

837:デフォルトの名無しさん
10/05/11 12:15:32
>>834
それ以前に
文字列の初期化なし
入力妥当性チェックなし

838:デフォルトの名無しさん
10/05/11 12:29:04
>文字列の初期化なし
ってなんの話?

839:デフォルトの名無しさん
10/05/11 12:30:49
空の文字列入れるとか、memsetで埋めるとかしないと
何にも入ってない不定の状態での格納は危険じゃないかと。
あと、ch1~ch4に入れるときのキャストがなんか気持ち悪い。

840:デフォルトの名無しさん
10/05/11 12:37:33
>>839
>何にも入ってない不定の状態での格納は危険じゃないかと。
どんな危険があるのですか?


841:デフォルトの名無しさん
10/05/11 13:12:06
0でターミネートし忘れた場合とかぬかすんだろどうせw

842:デフォルトの名無しさん
10/05/11 14:29:03
至急!!!!

任意個数の整数を標準入力(キーボード)から入力し、
入力された整数の個数
平均値(小数点以下 1 桁まで表示)
最大値
最小値
を標準出力(ディスプレイ)に表示するプログラムがわかりません。


843:デフォルトの名無しさん
10/05/11 14:29:52
ただし、9999が入力されたら入力を終了するものとし、9999は入力個数、平均値、最
大値、最小値には含めない。
また、最初に9999が入力された場合には、入力個数=0、平均値=0.0、最大値=0、
最小値=0が出力されるようにする。


844:デフォルトの名無しさん
10/05/11 14:37:52
>>842
わかりました!!!!

845:デフォルトの名無しさん
10/05/11 14:55:29
>>834
NULLだろうけど変数が多いね。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
やりたいのはこういうこと?

846:デフォルトの名無しさん
10/05/11 15:01:03
>>842
まず、入力がなくなるまでループ
最初の1個目を最大値、最小値とみなす
2個目以降は最大、最小を調べる
合計値に順次足していってループ回数もメモっておく
ループ抜けたら最大値、最小値、平均値を出力しておわり

847:デフォルトの名無しさん
10/05/11 15:03:30
小数点一桁目まで出すのなら %.1f だっけ?

848:デフォルトの名無しさん
10/05/11 15:04:59
>>846
それができないから聞いてるんですけど・・・

849:デフォルトの名無しさん
10/05/11 15:27:07
>>484
なぜ出来ないか詳しく。
制限のためか、それともC言語を書けない為か?

850:デフォルトの名無しさん
10/05/11 15:35:03
ここまで書いたけど・・・とソース晒すとか、何がわからないのかを具体的・端的に説明するとかしない奴は
プログラムを自分で書く気はない。
宿題スレへ。

851:デフォルトの名無しさん
10/05/11 15:36:27
宿題スレどこ?w

852:デフォルトの名無しさん
10/05/11 15:48:34
死ぬがよい

853:デフォルトの名無しさん
10/05/11 16:44:46
課題で出たんですが
アルファベット1文字と整数型の数値 n を読み込んで,その文字の n 文字後の文字を表示するプログラムを書きなさい
とはどういうことでしょうか?アルファベットとは数値のことですか?全体的に問題の意味が
わからないんですが・・・

854:デフォルトの名無しさん
10/05/11 16:53:55
>>853
アルファベット1文字・・・A-Z a-z
整数型の数値n・・・0-99999999...

A + 0 = A
A + 1 = B
A + 2 = C ...

855:デフォルトの名無しさん
10/05/11 16:56:56
はぁ?アルファベットはアルファベットだろうが
つかCの話でもなんでもないじゃん

たとえば

a5 なら a から5番目→g
f3なら fから3番目→i
D1なら E ってことだろ

もらった文字に数字足して、zをこえるならAに残ったぶんを足すんじゃね?




856:デフォルトの名無しさん
10/05/11 16:59:21
a5 なら a から5番目→f だったwww
zまで行ったらAにもどるのめんどいなら
「そこに文字はないです」って言って再入力させるとか

857:デフォルトの名無しさん
10/05/11 17:40:08
うん?よくわかりません、アルファベットってのは数字に値するんですか?
どういう数え方ですか?アルファベットにアルファベットを足したら?
このプログラムの方法もよくわかりません。頭悪くてすいません・・・一応
今日も徹夜・・

858:デフォルトの名無しさん
10/05/11 17:49:22
>>857
アルファベットの文字コードのことなんだけどね。

char c = 'A';

という構文はわかる?
そして

c = c +1;
putchar(c);

とすると画面には B と表示されるんだけど・・・

859:デフォルトの名無しさん
10/05/11 18:03:43
>>857

アスキーコードでググれ
どのアルファベットがどの数字に割り当たってるのかわかるし
順番に並んでるのを見れば理解も早い

860:デフォルトの名無しさん
10/05/11 18:08:33
いろいろな操作を行って、例えばABCD\0が入っている文字配列Z[5]を
空にする(宣言直後の状態に戻す)方法はありますか?
例えばループ中で代入しようとするとエラーを吐いてしまいます。

まだかなり初心者だと思いますが、よろしくお願いします。

861:デフォルトの名無しさん
10/05/11 18:13:04
>>860
とりあえず、君が書いたコードを貼れよ

あと宣言直後は空でなく、デタラメな文字が入ってるよ。

862:デフォルトの名無しさん
10/05/11 18:28:58
>>860
memset( Z, 0x00, sizeof( Z ) );

863:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/05/11 18:31:35
宣言直後に入っている文字列を別の配列にコピーしておいてあとでコピーしなおせばいいんじゃないの?何がしたいのか分からんが。

865:デフォルトの名無しさん
10/05/11 18:39:44
>>860
*z = '\0';

866:デフォルトの名無しさん
10/05/11 20:21:33
>>865
君は C プログラマには向いてないから
BASIC 等をやったほうが良いんじゃないかな。

867:デフォルトの名無しさん
10/05/11 20:57:13
>>866
なんだって

868:デフォルトの名無しさん
10/05/11 22:16:02
シューティングゲーム作ってるんですが、int型とdouble型では
どちらのほうが計算速度が速いですか?

869:デフォルトの名無しさん
10/05/11 22:17:23
double型。

870:デフォルトの名無しさん
10/05/11 22:21:20
>>869
ありがとう!

871:デフォルトの名無しさん
10/05/11 22:22:40
んなわけないだろ。

872:デフォルトの名無しさん
10/05/11 23:03:44
いやdouble型早いから

873:デフォルトの名無しさん
10/05/11 23:16:39
今時のCPUならほとんど変わらない、まぁ、実測が基本
intからdoubleとかdoubleからintへの変換が多くあると急激に遅くなる
がんばって、固定小数にしてもそれほど早くもならなかったので、浮動小数でいいやとなった
これ以上速くしようと思ったらアルゴリズム改良するかGPUに支援してもらうか、はぁ

874:デフォルトの名無しさん
10/05/11 23:44:15
VIA の CPU なら整数演算でないと激遅

875:デフォルトの名無しさん
10/05/11 23:48:05
浮動小数点型はCPUによって微妙に数値誤差の出方が変わるので
リプレイ機能と相性が悪い聞く事がある
同じIntel系同士でもそうなるのかは俺は知らない

876:デフォルトの名無しさん
10/05/11 23:49:50
使う命令を切り替える実装を使うな

877:デフォルトの名無しさん
10/05/11 23:56:58
アセンブラでCPUの拡張命令(SSEとか3D Now!!)を叩くしかない。

878:デフォルトの名無しさん
10/05/12 00:11:57
WINAPIのwsprintfでは実数が扱えなかったので、
sprintfを使いました。
そこからWINAPIのTextOut等で、ウィンドウに文字を表示したいのですが、
char *型からLPCWSTRへの変換が出来ないのでエラーになります。
何かいい方法ありませんか?



879:デフォルトの名無しさん
10/05/12 00:22:21
mbstowcsって言えばいいのかな?

880:デフォルトの名無しさん
10/05/12 00:41:05
>>858
char型って整数の範囲決まってませんでした?じゃぁnが大きいと
計算できないんじゃ?Aは65ってこと?
プログラムにはアルファベットとnを入力させるように作るのですか?・・
初心者に見せかけて相当理解力が弱いんで優しくしてください・・
まじわからんww

881:デフォルトの名無しさん
10/05/12 00:47:53
文字コードってのがあんだよ。
コンピューターは01しか理解できないから文字も01に変換して処理させてるわけ。

882:デフォルトの名無しさん
10/05/12 00:54:44
>>878
tchar.hをインクルードして_stprintf使え。
これでcharではなく、Windows APIのTCHARが使える(正確には、ちと違うが)。

883:デフォルトの名無しさん
10/05/12 00:55:21
>>878
TextOutA()

884:デフォルトの名無しさん
10/05/12 00:56:04
ASCIIコード表を見るといいと思うよ。

885:デフォルトの名無しさん
10/05/12 00:56:55
>>881
文字コードは01じゃないけどな。

886:デフォルトの名無しさん
10/05/12 01:00:07
2進数に直したら全部01だろ馬鹿か

887:デフォルトの名無しさん
10/05/12 01:00:51
直すからだろw

888:デフォルトの名無しさん
10/05/12 01:01:49
>>1
山手線符号化したら、全部駅名だろwwアホww

889:デフォルトの名無しさん
10/05/12 01:32:15
>>888
もしよろしければどこへの誤爆かおしえていただきたいのですがいかがですかね

890:デフォルトの名無しさん
10/05/12 01:41:51
>>882
TCHAR の意味解ってないだろ。

>>884
ASCII とは限らないだろ。

891:デフォルトの名無しさん
10/05/12 01:49:13
TCHAR?
ティーチャーって先生って意味ですよね。


892:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/05/12 08:03:20
>>882
_stprintfから、swprintfの存在を知り、問題なく実数でも扱えて
処理できました。

ありがとう!

894:デフォルトの名無しさん
10/05/12 08:31:06
文字コード云々じゃなくてさ、問題の意味がわからないって質問だろ?
アルファベットにアルファベットを足すとか言ってるし、「整数 n」←このnをアルファベットだと思ってるんじゃないの?
入力されたアルファベットにnというアルファベットを足すってどういう意味って聞いてるんじゃないの?

895:デフォルトの名無しさん
10/05/12 08:58:14
初心者質問していい?

896:デフォルトの名無しさん
10/05/12 09:02:10
だめ

897:デフォルトの名無しさん
10/05/12 09:51:53
>>895
どうぞ。

>>894
>「整数 n」←このnをアルファベットだと思ってるんじゃないの?
その発想はなかったw

898:デフォルトの名無しさん
10/05/12 12:11:13
どうも元質問者は VBからの移行なのか variant型 が当然のようで

 変数 a に 文字の '1' を与える
 → 整数演算の時 値として 1 に評価される

という思考から抜け出せないでいるようだ

899:デフォルトの名無しさん
10/05/12 13:46:27
PHPとかその辺混乱しまくりw

900:デフォルトの名無しさん
10/05/12 15:29:52
いつの話してんだ

901:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/05/12 19:01:11
スタックがあふれるならヒープに取ればいいじゃない、ということで、
mallocとか使って動的にメモリを確保するんです。
多分その段階だとポインタになれてないだろうから、がんばれ、とエールを。

903:デフォルトの名無しさん
10/05/12 19:05:58
取り敢えず、スタックの割り当てを増やすのも手かと。

904:デフォルトの名無しさん
10/05/12 19:09:29
適当にテストするならグローバルにすればよころう。

905:901
10/05/12 19:13:58
>>902
ありがとうございます.
もう一度調べなおしてみます.

906:デフォルトの名無しさん
10/05/12 20:06:33
>>901
>editbin /stack:1000000
とかやっとけば OK

907:デフォルトの名無しさん
10/05/12 20:38:04
>>906
なんでそんなひどいこというの?

908:デフォルトの名無しさん
10/05/12 21:43:28
>>894
質問したものですが
さすがにそれはないです。このスレでも意見分かれてませんか?
nをたくさんたすとzまでいってまたaに戻るとか。
アルファベトに数値をたすって意味が分からないんですよ。
たとえばAに1000足したら?
Aとはそもそも何か、16進数の10番目のやつか、何ちゃら
規格とかのコードなのか。それが分かりません

909:デフォルトの名無しさん
10/05/12 21:50:49
てst

910:デフォルトの名無しさん
10/05/12 21:55:19
>>908
> アルファベトに数値をたすって意味が分からないんですよ。
'A' は0x41や65の別表現でしかない。('A'==0x41==65)
全て内部的にはただの数値。
'A'+1==0x42==66=='B'


911:デフォルトの名無しさん
10/05/12 21:55:20
アルファベットに数字を足す問題ですが、
クラスの友達に聞いて解決しました。
ここの人たちは理解力がなさすぎだと思います

912:デフォルトの名無しさん
10/05/12 21:56:26
>>908
'a'+1='b'
これならわかる?

913:デフォルトの名無しさん
10/05/12 21:57:59
>>908
URLリンク(ja.wikipedia.org)

ここを読めば文字「A」が65に対応してることがわかるとおもうよ。

914:デフォルトの名無しさん
10/05/12 22:01:28
まぁ、普通はアルファベットに数値を足すと聞いたらアルファベットを並べて何文字か後のことだ。なんて思わない罠。

915:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/05/12 23:02:57
×func
○f

918:デフォルトの名無しさん
10/05/12 23:37:56
プロトタイプ宣言と定義で戻り値の型が喰い違っている。

919:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/05/13 02:30:42
>>908
もっと単純に考えたら?
Aの次のアルファベットって何?って聞かれたら困るのかな。そういうレベルよ。
Hの3つ前のアルファベットは?

で、zの次は何?って聞かれた時に、
・ないわー
・最初に戻ってa
・小文字終わったからA
とするか、そこは問題に明記されてないから、あなたが決めなきゃならないという話

921:デフォルトの名無しさん
10/05/13 02:31:23
解決してタワーorz

922:デフォルトの名無しさん
10/05/13 03:55:38
成りすましにマジレスしなくてもw

923:デフォルトの名無しさん
10/05/13 09:44:49
Cでプログラム組んでます。
ファイルの扱い方で質問があります。

fopen、fread、fwrite、fseek、fclose
でファイルの読み込みや書き込みを行っているのですが
あるファイルを読み書き可能状態でfopenして
10バイトfwiteしたあと、fcloseせずに
書いたデータをファイルの最後から1バイトずつfseekして
freadして、その1バイトが特定の条件に一致した場合に
そこまで読み込んだデータを破棄して
10-fseekしたバイト数だけのファイルを作りたいのですが
そんなこと可能なのでしょうか?

fwiteする前に書き込みデータをチェックしたかったのですが
その部分には手を入れられないため、
1度書き込んだファイルの途中をぶった切れるのかが知りたいです。

■■■■■■■□□□

□を破棄して、■だけのデータを作りたいというようなイメージです。

924:デフォルトの名無しさん
10/05/13 09:55:29
chsize

925:デフォルトの名無しさん
10/05/13 09:56:49
>>923
ftruncate()が使えればできなくはないが、事情が許すなら別ファイルに書き出すのが無難。

926:デフォルトの名無しさん
10/05/13 10:00:44
>>923
fclose()した後に切り詰めたいなら>924かtruncate()、開いたまま切り詰めたいならftruncate()。
但し、後者はファイルハンドルをfileno()で取得する必要あり。

927:デフォルトの名無しさん
10/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;
}


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch