C言語なら俺に聞け( ..
[2ch|▼Menu]
175:デフォルトの名無しさん
07/12/25 18:36:41
>>167,173
●文字列にする方法
char pai ⇒ const char *pai
'3'など ⇒ "3"
printf() ⇒ printf("%s", ...


●ワイド文字にする方法
char pai ⇒ wchar_t pai
'3'など ⇒ L'3'
printf() ⇒ wprintf(L"%lc", ...

かなあ? いまいち自信なし。


176:デフォルトの名無しさん
07/12/25 19:18:52
>>167

char pai[3][9] = { {'1','2','3','4','5','6','7','8','9'},
{'@','A','B','C','D','E','F','G','H'},
{'一','二','三','四','伍','六','七','八','九'},
};

↑この時点でスタック壊してるな。
何が起こっても不思議ではない。
ワイド文字にしたほうがよい。


>●ワイド文字にする方法
>char pai ⇒ wchar_t pai
>'3'など ⇒ L'3'
>printf() ⇒ wprintf(L"%lc", ...

処理系がわからんが、VCなら L'3' じゃなくて_T('3')のほうがいい。


177:デフォルトの名無しさん
07/12/25 19:38:19
>>161
n = (m+0.5)/d;

178:デフォルトの名無しさん
07/12/25 19:53:57
>>176
ワイドじゃないとダメだから _T にしたらあかんがな。

179:デフォルトの名無しさん
07/12/25 23:07:29
某サイトの問題をやってみました。
【問題】
文字列Aのm番目からn個分の文字列を配列Bにコピーする
サブルーチンを作れ。
ただし、m,nの値が文字列Aの範囲を超えるような値が入力
されたら1を返し、正常にコピーできたら0を返す。

こんなプログラム組みました。
問題中のm,n,文字列A,Bの各オブジェクト名,サブルーチンの返値は
勝手に解釈して組んでます。(正常時TRUE(1),異常時FALSE(0))


180:デフォルトの名無しさん
07/12/25 23:08:45
#include <stdio.h>
#include <string.h>
#define STR_MAX 10
#define TRUE 1
#define FALSE 0
typedef unsigned short BOOL;
BOOL BlockCopy( unsigned char*, unsigned char*, short, short );
// メイン関数
int main( void )
{
unsigned char szSrcName[STR_MAX+1];
unsigned char szDstName[STR_MAX+1];
short nStartPos = 0;
short nCopyLen = 0;
printf( "Input Str : " ); scanf( "%10s", szSrcName );
printf( "Input StartPosition : " ); scanf( "%d", &nStartPos );
printf( "Input CopyLength : " ); scanf( "%d", &nCopyLen );
if( BlockCopy( szDstName, szSrcName, nStartPos, nCopyLen ) == FALSE )
{
puts( "Error!!" );
return 1;
}
printf( "入力文字列 : %s\n", szSrcName );
printf( "コピー文字列 : %s\n", szDstName );
return 0;
}

181:179,180
07/12/25 23:09:25
// サブルーチン関数
BOOL BlockCopy( unsigned char* s1, unsigned char* s2, short m, short n )
{
int i;
short nLen = strlen( s2 );

if( nLen < m || nLen < (m+n) || nLen < n )
return FALSE;
memcpy( s1, s2+m, sizeof(char)*n );
return TRUE;
}

動作的には問題ないと思ってますがアドバイスお願いします。
また、この組み方はセンスないぞと思われる方は、よりよい
プログラムの組み方を教授して頂ければ幸甚です。

182:デフォルトの名無しさん
07/12/25 23:20:56
Windows2003Server上でVMware Serverを使ってRHE3を動かしてます。
その上でlibjpeg.soを使ったjpeg圧縮ライブラリを作りましたが、
jpeg_create_compress()を実行した時点で以下のメッセージが出て先に進みません。

JPEG parameter struct mismatch: library thinks size is 372, caller expects 376

構造体のサイズが合っていないと言ってるのはわかるのですが、
libjpeg.soとjpeglib.hのVerは合わせてありますし、
同じ名前のファイルが複数存在しない事も確認済みです。

どなたか解決方法を知らないでしょうか?


183:デフォルトの名無しさん
07/12/25 23:40:13
>>181
・無闇とshortを使うのはよくない。
・sizeof(char)が1であることを前提としている関数を使うのにsizeof(char)を掛けるのはおかしい。
・「文字列をコピーする」関数なのだから、ナルターミネートは保証するべき。

ってことで、判定部を除くとこれでいい。
sprintf(s1, "%.*s", n, s2 + m);

184:デフォルトの名無しさん
07/12/25 23:55:05
C言語でポートを選び、指定して
相手とファイルをやり取りするってプログラムを作りたいんだが。

どんな関数とか使うんだ?接続など

185:デフォルトの名無しさん
07/12/25 23:57:46
>>184
環境と使うライブラリによって違う。

186:デフォルトの名無しさん
07/12/26 00:05:04
相手==

187:デフォルトの名無しさん
07/12/26 01:13:18
>>180
その手の文字列処理関数は、コード見ないとどの引数が入力でどれが出力か分からないから、
プロトタイプ宣言だけで分かるようにconst付けたり仮引数名を工夫したりするといい

BOOL BlockCopy(unsigned char* dst, const unsigned char* src, short, short );

188:デフォルトの名無しさん
07/12/26 01:24:37
>>182
.so と .h の不整合ではなくて、.so を作ったときのコンパイラ(構造体
のパディング)とそれを利用するプログラムのコンパイラ(構造体のパディ
ング)が違うんだろう。


189:デフォルトの名無しさん
07/12/26 08:30:05
>>182
#pragma pack(push,4)
#include"jpeglib.h"
#pragma pack(pop)

もしくはコンパイルオプションで指定

190:182
07/12/26 10:42:05
>>189

#pragma指定を追加する事で無事にプログラムが流れました。
gdbで構造体を確認しましたが壊れている様子もありませんでした。
どうもありがとうございました。

191:デフォルトの名無しさん
07/12/26 14:01:12
printf("%.4s", s);

の%.4sってどういう意味でしょうか?

192:デフォルトの名無しさん
07/12/26 14:08:20
>>191
最小幅と最大幅の指定のうち、最小幅を省略したもの

193:デフォルトの名無しさん
07/12/26 14:45:17
>>192
ありがとございました。

194:デフォルトの名無しさん
07/12/26 21:07:06
質問いいですか

#include <stdio.h>
int main(void)
{
printf("%d\n",10*2);
return 0;
}
この場合関数の型名ってあんまり意味ってないんですよね?
変数宣言などするときに意味があったりするんですか?

195:デフォルトの名無しさん
07/12/26 21:16:37
もうちょっと何が聞きたいのかはっきりしてくれ。
関数ってどっちの関数?main?printf?
型名って何の型名?引数?戻り値?

196:デフォルトの名無しさん
07/12/26 21:21:20
>>194
質問の意味がよくわかんね
printfは可変長引数
floatとか使いたいとき明示的に
接尾子のfを付けたりする

197:デフォルトの名無しさん
07/12/26 21:24:32
main の戻り値に意義が見いだせないという事なのか、
それとも printf の戻り値を使ってないという事に関する疑問か。

198:デフォルトの名無しさん
07/12/26 21:43:08
うぉ・・・エスパーできん・・・

199:デフォルトの名無しさん
07/12/26 21:48:27
これは10*2に対して、一時変数に格納する意味なんて無いよね?っていうことでは

200:デフォルトの名無しさん
07/12/26 21:51:30
>>195
だって苦しむなんちゃらには
型名 関数名(引数){なんちゃら}
で関数って書いてあったんだもの><

>>199
そのとおりでございます

201:デフォルトの名無しさん
07/12/26 22:04:26
>>200

やっぱりわかんね。

int temp = 10 * 2;
printf("%d\n",temp);



printf("%d\n",10*2);

は、最適化されて同じバイナリが吐かれるよね?、ということを聞いてる?


202:デフォルトの名無しさん
07/12/26 22:08:03
あー printf にも戻り値は int型 って関数バイブルみたいな本に書いてあったな。
そういうことじゃ?

203:デフォルトの名無しさん
07/12/26 22:09:55
>>201
#include <stdio.h>
int main(void)
{
printf("%d\n",10*2);
return 0;
}
の場合intは文的には必要だが機能としてはまったく意味はない??が
#include <stdio.h>

int main(void)
{
printf("%d\n",(int)(1.05 * 360));
return 0;
}
のようにキャスト変換などするとintが使用されるっていうか
意味があるっていうか・・・・
そんな感じです

204:デフォルトの名無しさん
07/12/26 22:11:45
>>203
そもそも関数の型の意味を理解していないな。
int mainのintは戻り値(OSに正常終了か否か)をreturn 0 か1かで必要だからint mainなんだよ。


205:デフォルトの名無しさん
07/12/26 22:13:56
>>204
まだそこまでたどりついてません・・・
今苦しんでのキャスト変換のところなんで
もっと勉強すればわかることなんですね

206:デフォルトの名無しさん
07/12/26 22:17:41
>>203
関数の戻り値が分かってない?
これは何をしているかわかる?

int unko(int x) {
int z = x*2;
return z;
}

int main()
{
int temp = unko(100);
return 0;
}


207:デフォルトの名無しさん
07/12/26 22:18:11
キャスト変換はただその時の型を「一時的に強制的のその型にする」って理解すればいいと思うよ。
int main(void)

    〜〜〜
    return 0;

は、関数の章で学ぶと思うから、
今は明示的に書かなければならないと思っておけばOK。
あまり先飛びすぎても混乱するだけだしね。


208:デフォルトの名無しさん
07/12/26 22:46:21
>>203
整数リテラル 10 はそれ自体としてintという型を持っている。
整数リテラル 2 もintで、int*intの結果はint型になることになっている。

209:デフォルトの名無しさん
07/12/26 22:52:30
ってそういうことじゃないのか。

210:デフォルトの名無しさん
07/12/26 23:03:58
>>194
とりあえず総じて何が聞きたいのか理解できん。
まずはここあたりを順に読んで、基本を覚えよ。
URLリンク(homepage1.nifty.com)

211:デフォルトの名無しさん
07/12/26 23:29:52
>>205
そのサイトは地雷原だから、他で勉強することを強くお勧めする。

212:デフォルトの名無しさん
07/12/26 23:31:17
URLリンク(www9.plala.or.jp)
ここオヌヌメ
友達から教わったけど、ここだけでCの基礎はバッチリ・・・?覚えたよ
ていうかC言語でググると一番上に出てくる

213:デフォルトの名無しさん
07/12/26 23:43:51
>>212
あー、間違いをそれと知らずに教わるにはいいかも。

214:デフォルトの名無しさん
07/12/26 23:44:32
どういうこっちゃ?

215:デフォルトの名無しさん
07/12/26 23:46:46
今時 C から始めるのは損だよ。
C++ の本でも最初のうちは C と似たようなもんだし、
その延長で C++ まで覚えてしまった方が絶対得だよ。

216:デフォルトの名無しさん
07/12/26 23:47:18
いきなりC++はどうだろうか。
C++はしょっぱなからクラス教えないっけ?

217:デフォルトの名無しさん
07/12/26 23:57:32
C++が仕様としてカバーしているCとしての意味での、C++ってことじゃない?
まずCをやるんだけど、mallocとかFILE*とか、C++ではとって変わった部分を捨てて、
そのままC++のクラスなりnewなりをやれ、みたいなぁぁぁ

218:デフォルトの名無しさん
07/12/26 23:58:16
>>214
間違いがあるってことだろ。間違いかどうかは微妙だけど、こういう書き方されるともにょる。
>つまり、書き換える必要のある文字列は、一旦文字型配列に格納してから処理をするのが無難だと言えます。
# 無難も何も、文字列リテラルを書き換えるのは論外なわけで……

219:デフォルトの名無しさん
07/12/27 00:08:39
言葉が足りないんじゃないか
格納=コピーならいいけど、ポインタだけ格納してもね

220:デフォルトの名無しさん
07/12/27 03:29:34
#include<stdio.h>
int main(void)

{
int i,d=97,c=65;
char ca;

scanf("%c",&ca);

for(i=65;i=<90;i++){
if(ca=c){
ca=d;
breke;
}
else{
i++,d++,c++;
}
}

printf("ca = %c ",ca);

return 0;
}

なんでこれがコンパイルできひんのじゃ!C言語死ねッ!!!!!

221:デフォルトの名無しさん
07/12/27 03:47:14
if(ca=c)がおかしい
比較じゃなく代入してる

222:デフォルトの名無しさん
07/12/27 03:49:14
ほんまや!!!!!



すまんかった・・・・・

223:デフォルトの名無しさん
07/12/27 03:49:59
んでfor分の終了条件が=<なんて演算子はない。 <= だ。
ついでにbreak。brekeなんてない。

224:デフォルトの名無しさん
07/12/27 03:50:30
ていうかコンパイルエラー見れば原因わかるんだけど、コンパイラ何使ってるんだ???

225:デフォルトの名無しさん
07/12/27 03:51:48
ボーランド
プロンプト読めない

226:デフォルトの名無しさん
07/12/27 03:53:10
URLリンク(hp.vector.co.jp)
オヌヌメ

227:デフォルトの名無しさん
07/12/27 03:56:51
ありがじゅう。
お気に入り追加した

この恩は忘れるまで忘れない!

228:デフォルトの名無しさん
07/12/27 04:03:27
>>220
コンパイラタン(AA略)「なんでよ私一生懸命やってるじゃん!なんでそんなこと言うの!・・・ヒドイヨ・・・・・」

229:デフォルトの名無しさん
07/12/27 04:09:30
コンパイラタン「と、途中でそんなの挿入したら、(エラーが)で、出ちゃうじゃない・・・・・!!!」

230:デフォルトの名無しさん
07/12/27 04:37:37
その夜”ピ、ピ、”と言う不思議な音が深夜の闇の中木霊しつづけた・・・

231:デフォルトの名無しさん
07/12/27 04:43:19
コンパイラタン「だ、だめっ!そこに"Shift"しちゃダメェェェェェ!!!」

232:デフォルトの名無しさん
07/12/27 07:24:49
自分で色々検索して、何度も本を読み返したのですが判らないので質問です。
下記のソースでコンパイルは通るのですがIF文で条件外でも処理を実行してしまうようなのです。
どこが間違っているのか教えてください。お願いします。

#include <stdio.h>
#include <ctype.h>

main() {
  int i;
  int date[10];

  for(i=0 ; i<10 ; i++) {
    scan:
    printf("%d個目のデータ:", i+1);
    fflush(stdin);
    scanf("%d", &date[i]);
    if(isdigit(date[i]) == 0) {
        printf("数値を入力してください。\n");
        date[i] = 0;
        goto scan;
    }
 }
  printf("前から6個目のデータ:%d", date[5]);
  return 0;
}


233:デフォルトの名無しさん
07/12/27 08:13:57
scanf("%d", &date[i]);
既にここで入力を数値として変換してしてるので scanfの戻り値を調べるといいよ。
isdigitは文字が('0'〜'9')かどうか判定する関数。
それとこの状況でわざわざコードを読みにくくするgotoを使用する意味はない。
whileとbreakで代用したほうがいい。

234:232
07/12/27 08:27:31
>>233
ああ、そっか。%dだから受け取った時にすでに数値になってるんだ。なるほど。
じゃあこの場合文字を入れさせないようにするにはどういう風にしたら良いのでしょうか?

>whileとbreakで代用したほうがいい。
たしかにその通りです。気をつけます。

235:デフォルトの名無しさん
07/12/27 08:27:50
>>232

> main() {
>   int i;
>   int date[10];
>
>   for(i=0 ; i<10 ; i++) {
>     scan:
>     printf("%d個目のデータ:", i+1);
>     fflush(stdin);
入力ストリーム(stdin)のフラッシュは未定義
したこと無いけどたぶんフラッシュされない。
>     scanf("%d", &date[i]);
>     if(isdigit(date[i]) == 0) {
isdigitの引数は文字。'1'は文字。1は数値。ってな感じ。
>         printf("数値を入力してください。\n");
>         date[i] = 0;
>         goto scan;
>     }
>  }
>   printf("前から6個目のデータ:%d", date[5]);
>   return 0;
> }
>


236:デフォルトの名無しさん
07/12/27 08:28:52
>>232

まず、直接関係ないが、

        goto scan;

↑これは止めれ。こういうときはwhile文を使うのがセオリーだ。


isdigit()は「文字が数字かどうか」を判定する関数だよ。
scanf()で変換すると「数値」(int型)になるので、

    scanf("%d", &date[i]);
    if(isdigit(date[i]) == 0) {

これだとisdigit()は常に0を返すはず。
それに、scanf("%d", &date[i]); の場合、数字の入力を期待しているので、
それ以外の文字は入力されてもdate[i]に入らない。


237:デフォルトの名無しさん
07/12/27 08:38:22
>>210

 main()

これでCマガジンに連載できるなんて…。・゚・(ノД`)・゚・。
休刊もやんぬるかな。



238:デフォルトの名無しさん
07/12/27 09:29:02
>>237
省略した場合はintって決まりなかった?
だから一応正しいんじゃない?

239:デフォルトの名無しさん
07/12/27 09:31:09
>>234
scanfの戻り値を利用する
scanfはスキャンに成功した数を返すから、
今回のケースで文字を入力されたら0が返る

240:デフォルトの名無しさん
07/12/27 09:35:56
>>232
>scanf("%d", &date[i]);

241:デフォルトの名無しさん
07/12/27 09:43:47
途中でエンター押しちゃったw
>>232
>scanf("%d", &date[i]);
こういう取り方は文字/数字チェックそのものに意味が無いのでやめ

普通はバッファの文字列変数を用意させて、そこに入力させる。
それをisdigit()に通してクリアしたら、その時点でdate[i]に代入するようにすればいい。


242:デフォルトの名無しさん
07/12/27 11:13:33
たぁすけてぇぇぇ!
結果がへんになる!!!

#include<stdio.h>
int main (void)
{
int a,c;
float b,d;
b=1,d=1;
scanf("%d",c);

for(a=1;a<=1000;a++){
b=b+d;
if(b*b==c){
break;
}
if(b*b<=c)
d=d*0.1;
}
printf(" %d の平方根は= %f ",c,b);
return 0;
}

243:デフォルトの名無しさん
07/12/27 11:21:53
>scanf("%d",c);

244:デフォルトの名無しさん
07/12/27 11:27:04
真に申し訳ございません。どうゆうこと?

245:デフォルトの名無しさん
07/12/27 11:30:23
あああああああああああああああ
すいませんすいませんすいません!
もうしませんもうしませんもうしません!

246:デフォルトの名無しさん
07/12/27 14:22:54
辞書検索の2分探索を下みたいに書いたんですけど、
????のところ(該当しなかった場合)が思いつきません。
助けてくださいです…

char a[20];
char b[20];
int hi,lo,i;



hi=i;
i=i/2;
lo=0;
while(1){
if(strcmp(b,a) < 0){
hi=i;
i=i-(hi-lo)/2;
}else if(strcmp(b,a) > 0){
lo=i;
i=i+(hi-lo)/2;
}else if(strcmp(b,a) == 0){
printf("あった");
break;
}else if( ???? ){
printf("そんなものなかった");
break;
}
}


247:デフォルトの名無しさん
07/12/27 14:30:21
>>246
そこは if (lo > hi) を入れたいんだと思うが、
突っ込みどころが多すぎるからもうちょっと練り直して来い。

248:デフォルトの名無しさん
07/12/27 14:34:43
せっかくなので1つ突っ込んでくだしあ

249:デフォルトの名無しさん
07/12/27 14:45:05
if文の比較で最初の3通りのどれかに必ず含まれるから最後のelseは
絶対通過しない、まあelse外せばいいけど。
で、1ループでstrcmpは1回呼べばいいべ。
あと文字列が終わったのをチェックしないとね。
略の部分を略さないでテスト用に値設定したやつさらしてみてね。

250:246と248
07/12/27 14:55:46
あ、ほんとだ。
ちょとまってください。

251:デフォルトの名無しさん
07/12/27 15:10:06
#include <stdio.h>
int main(){
int i,j;

for(i=1;i<=9;++i)
printf("%2d ",i);
printf("\n--------------------------\n");

for(i=1;i<=9;++i){
for(j=1;j<=9;++j)
printf("%2d ",i*j);
printf("\n");
}

return 0;


for文の練習で書いた上の九九を表示するプログラムをwhile文だけで書けないかなぁと思って

252:デフォルトの名無しさん
07/12/27 15:10:38
>>251の続き

#include <stdio.h>
int main(){
int i=1;

while(i<=9){
printf("%2d ",i);
i++;
}
printf("\n--------------------------\n");

i=1;
int j=1;
while(i<=9){
while(j<=9){
printf("%2d ",i*j);
j++;
}
printf("\n");
i++;
}

return 0;
}


このように書いてみたのですが1の段以降改行だけでプログラムが終了してしまいます
どうやったら上手く動かせるでしょうか

253:デフォルトの名無しさん
07/12/27 15:13:52
>>252
jの値がどういう風に変化するか追ってみよう。


254:デフォルトの名無しさん
07/12/27 15:13:58
>>252
while (j<=9) のループ抜けたらj を1に戻さないと。

255:デフォルトの名無しさん
07/12/27 15:20:50
あーjが9のままだから次以降のループはスキップされちゃうのか
ヒントありがとうございました

256:246他
07/12/27 15:54:11
せっかくレスくれたのに放置ですみません。
またあとで伺いにきます。

かしこ

257:デフォルトの名無しさん
07/12/27 16:38:48
大学が決まって4月がで暇なのでC言語を勉強しようと思っているのですが

苦しんで覚えるC言語
URLリンク(homepage3.nifty.com)
というサイトを見つけたのですがこのサイトはどうでしょうか?

初心者にいいサイトや本を教えてください

258:デフォルトの名無しさん
07/12/27 16:56:00
それでいいよ

259:デフォルトの名無しさん
07/12/27 17:31:45
>>257
おk

260:デフォルトの名無しさん
07/12/27 17:37:17
いいのかよw

261:デフォルトの名無しさん
07/12/27 18:13:44
>>257
そのサイトはダメ出しされているよ。

262:デフォルトの名無しさん
07/12/27 18:33:23
ダメ出しすれば著者を超えた気分になれるよね

263:デフォルトの名無しさん
07/12/27 18:40:27
あんたは小石を跨いでも小石を超えた気分になれるのか?

264:デフォルトの名無しさん
07/12/27 18:54:03
aho

265:デフォルトの名無しさん
07/12/27 18:57:48
>>257
そのサイトで勉強すると、>19や>205みたいなことを書くようなお馬鹿になっちゃうよ。

266:デフォルトの名無しさん
07/12/27 19:03:50
>>257
参考になるけど、やっぱり本がいいよ。
独習Cとか、やさしいCね。

267:デフォルトの名無しさん
07/12/27 19:04:05
どうなろうと後で矯正するからいいよ。

268:デフォルトの名無しさん
07/12/27 19:05:44
まあ初心者はどのサイトから始めてもいいと思うけど、
そこに留まらずいくつかのサイトを回った方がいいよ
そして宿題スレで宿題を解く
ついでに簡単なデータ構造、アルゴリズムも学ぶ
こんな感じで基礎はおk

269:デフォルトの名無しさん
07/12/27 19:09:25
他のサイトを見るたびに、こんなやり方があったのか!
ってなって悲しくなるぞ。

270:デフォルトの名無しさん
07/12/27 19:37:32
他のサイトを見るたびに、こんなやり方があったのか!
ってなって嬉しくなるぞ.

271:デフォルトの名無しさん
07/12/27 19:50:21
特定のサイトにいついたことはないなあ
適当に検索して、
その日見つけたサイトをぱらぱらと読む
サイト規模にもよるけど1日ありゃ十二分に読み終われるとこばっかだし

272:デフォルトの名無しさん
07/12/27 20:08:52
おれのお勧め、更新は止まってるけど・・・
URLリンク(mikata.curiocube.com)

273:デフォルトの名無しさん
07/12/27 20:10:38
WisdumSoftでC言語の基礎文法を覚えて
(例文の内容にアニメ好きがかもしだされているが)
Programing Placeでデータ構造とかその他の
知識を学ぶ。
で理解できない所(ポインタとかかな)を重点的に
載せてる本でさらに学ぶ。
あとは、経験値をつけていくだけだ。

274:273
07/12/27 20:11:47
間違えたWisdomSoftだ

275:デフォルトの名無しさん
07/12/27 21:02:21
変数宣言と代入ってつなげられるんですか?

276:デフォルトの名無しさん
07/12/27 21:05:44
>>275
いいえ、それは初期化です

277:デフォルトの名無しさん
07/12/27 21:10:49
苦しんでわけわかめ
違うサイトで勉強するわ
お勧め教えてくだしあ

278:デフォルトの名無しさん
07/12/27 21:17:21

猫でも解るって、ぶっちゃけどう?

携帯からサーセソw

279:デフォルトの名無しさん
07/12/27 21:21:20
>>275
int i;
i = 0;
を指してるなら可能だし
int i=0;
なら>>276の言うとおり「初期化」という。

280:デフォルトの名無しさん
07/12/27 21:33:14
初期化と代入はどう違うんですか?

281:デフォルトの名無しさん
07/12/27 21:36:05
初期値を指定するのが初期化。

初期化と代入ではできることが違う場合がある。
配列は一気に全要素を初期化できるけど、
一気に全要素に代入することはできず、
1要素ずつしか代入できない、とか。

282:デフォルトの名無しさん
07/12/27 21:36:06
const int x;
x = 1; //Error
//代入できNEeeee!!!

const int x = 1; //OK
//Yeah! 初期化最高!!

283:デフォルトの名無しさん
07/12/27 21:36:51
>>280
ぜんぜん違う。初期化される前の値が何であるかは神のみぞ知る。

284:デフォルトの名無しさん
07/12/27 21:39:47
以下の二つのコードで、
仮に最適化されないとするなら、
生成される機械語コードは同じですか?
それとも違う?

(1)
int array[2] = {1,2};

(2)
int array[2];
array[0] = 1;
array[1] = 2;

285:デフォルトの名無しさん
07/12/27 21:40:47
コンパイラ次第

286:284
07/12/27 21:41:47
すいません、ちょっと質問が悪いかも

初期化と代入は内部的に全く異なる処理をやっているんですか?
それともただ確保後に代入してるだけですか?内部的に。

287:デフォルトの名無しさん
07/12/27 21:43:53
コンパイラ次第

288:デフォルトの名無しさん
07/12/27 21:44:59
手元の環境で機械語コード生成してみればいいじゃん

289:デフォルトの名無しさん
07/12/27 21:48:46
rep movsd 使って初期化してるかもしれないし、
mov で初期化してるかもしれないし。
そのあたりはコンパイラ次第としか言いようが無い。

290:デフォルトの名無しさん
07/12/27 22:22:17
>>284
多分,全然違うコードになってる。

291:デフォルトの名無しさん
07/12/27 22:42:54
>>284
>仮に最適化されないとするなら、
これが殆ど意味がないのでなんとも言えない。

292:デフォルトの名無しさん
07/12/27 23:45:59
ってかマシン語レベルでの差なんて最適化どうこう言う前にコードが変われば変わる可能性はある。
空行(セミコロンのみの行)に対してNOPを吐くか消されるかだってコンパイラしだい。
予想でいいのならいくらでも応えられるけどな。

>>284のコードなら最適化関係なく同じコードが吐かれるかもね。

293:デフォルトの名無しさん
07/12/27 23:55:28
そんな事、気にしてたら禿げるぞ

294:デフォルトの名無しさん
07/12/27 23:58:41
これ以上禿げたら腋毛が無くなる
びっくりするほどなくなる

295:デフォルトの名無しさん
07/12/28 00:17:48
機械語レベルを気にする必要があるくらい禿てたら手段くらい知ってるだろ

296:デフォルトの名無しさん
07/12/28 01:40:46
代入と初期化の違いは配列やれば判るよ
配列の初期化はOKだけど配列全体の代入はNG
なんでえ〜?ってのはポインタやると判る

297:デフォルトの名無しさん
07/12/28 02:13:30
Java厨です。

プロトタイプ宣言ってなんですか?
C言語ってなんで関数を使う前に宣言しとく必要があるんですか?
昔ながらの慣習みたいなものですか?
宣言無くてもコンパイル通るなら、
コンパイラの手抜きと違うんですか?
関数宣言がないときと宣言も定義もないときと
ちゃんとコンパイラは違うエラー出しますよね?

298:デフォルトの名無しさん
07/12/28 02:26:15
適度に手抜きしてくれないとコンパイルに時間がかかってしょうがないじゃないか

299:デフォルトの名無しさん
07/12/28 02:41:53
分割コンパイルしないなら無くても良いんじゃない?

300:デフォルトの名無しさん
07/12/28 02:49:42
C始めて3日くらいです
fopenとfcloseの使い方がようやく分かって、ポインタについては良くわかりません(変数の代わりなのかな?くらい
そこであるテキストファイルを開いて、その中にある文字列(英数字)からある文字列(setofなど)を探したいです
最終的にはある文字列が見つかる→その後ろ〜〜バイト(もしくは〜〜行)をコピーして、別のファイルにペースト というところまでやりたいのですが
検索しようとしている時点で詰まっています。ソースコードは以下です

#include <stdio.h>
#include <conio.h>
#include <string.h>
#define BUFFER_SIZE 200

main(){
       char buffer[BUFFER_SIZE],name[BUFFER_SIZE];
     FILE *fp;
      printf_s("test.txtを開こうとしました\n\n\n\n");
fp = fopen("test.txt", "r");
printf_s("検索文字列を代入してください\n");
scanf_s("%s",&name);
printf_s("%sを検索しています\n",name);
if ( !fp ){
printf("ファイルオープンエラー\n");
return 0;
}

while( fgets(buffer, BUFFER_SIZE, fp) ){
if(!strcmp(name,buffer)){
printf_s("%sが見つかりました!\n",name);
break;
}
}
fclose(fp);
}

301:デフォルトの名無しさん
07/12/28 02:54:03
以上のソースに対して、テキストファイルを用意します
『aaxaa        ←改行
bbxb         ←改行
cxc【EOF】』
すると、cxcを入力しても反応してくれず、strcmpのところでcxc\nに変更すると、ifの見つかりました文が出ます
コレに対する問題点としては
1.改行まできっちり一致しなければ見つからないことになる
2.bbxbで完全一致であるが、bxbでも部分一致で見つかったことにしたい
  しかし、今では1行読み込みのために不可能(BUFFER_SIZEを実数にしても無理)

というところです
〜〜の関数使ったほうがいいよ、とか、こういうルーチンで考えるとできるよ、っていうのがあればお願いします
わかりにくい質問で申し訳ありませんが、宜しくお願いします

302:デフォルトの名無しさん
07/12/28 02:55:05
>>300-301
strstr()

303:デフォルトの名無しさん
07/12/28 03:02:33
>>302
ありがとうございます。今色々なページを見てきたのですが…
返り値としてポインタとして返すんですね。ポインタと見た瞬間に顔が引きつったのですが…

void TestStrStr(void)
{
char *s1 = "abcdef";
char *s2 = "de";
char *cp;
cp = StrStr(s1, s2);
printf("'%s'の中に現れる'%s'という文字列は%d文字目にある.\n", s1, s2, cp - s1 + 1);
}

このようなソースを見つけました。printfの一番後ろにあるcp-s1+1はおそらく何文字目にあるか指定してくれてるようなのですが
ポインタ同士を引き算しているこのような場合、実数として計算をしているのでしょうか?


304:デフォルトの名無しさん
07/12/28 03:13:28
>>303
メモリアドレスを計算している。s1が100番地に格納されているとすると、メモリ上は
100 101 102 103 104 105 106 (メモリアドレス)
  a    b    c    d    e    f     \0
のようなイメージ。

strstr()は、見つかった部分のポインタを返すから、"de"を見つけたならアドレス103を返し、それをcpに代入している。
printf()の最後の引数はcp - s1 + 1、つまり103 - 100 + 1で4を返す。

305:デフォルトの名無しさん
07/12/28 03:23:02
>>304
なるほど。だからポインタは便利だって言われてるんですね…メモリ上の一番基礎になる数字を返すから…
ありがとうございます
もうちょっとポインタのこと勉強してからやってみます。とりあえず今日は寝ます
ありがとうございました

306:デフォルトの名無しさん
07/12/28 03:26:31
>>305
すまん、ちゃんと質問読んでなかったw

ポインタは「アドレスという数字」を格納する変数。
アドレスと聞くと拒否反応が出るかもしれないが、メモリ上の位置を表す何の変哲も無いただの数字。
ただし、四則演算のうち可能なのは加算減算だけで乗除は出来ない。やっても意味のある数字が得られないから。
正しくはインクリメント、デクリメントだけど、これについての詳細はググってくれ。

307:デフォルトの名無しさん
07/12/28 04:18:50
ポインタやる時はメモリマップ作って見ると良いよ
スタック、データ、コードのそれぞれのセグメントがどんな配置か判っているとポインタの理解が早くなる

308:デフォルトの名無しさん
07/12/28 07:55:49
>>306
ちょっとだけ語弊がありそうなので補足。

・ポインタ+整数 → n 要素だけすすめたポインタを算出
・ポインタ−整数 → n 要素前のポインタを算出

これは可能。ただし配列とか malloc で用意してある範囲を逸脱しないように注意。

・ポインタ−ポインタ → 2つの要素の差を整数で算出

なんだけど、この場合2つのポインタは同じ範囲を指すもの
(304みたいに同じ文字列内の違う位置を指すように)
でないといけないから注意。

309:デフォルトの名無しさん
07/12/28 08:31:18
アドレスは「符号なし整数には似ているけど、全く違う種類のデータ」だと考えた方がいい。
整数なら四則演算が定義できるが、アドレスの場合は>>308の言う通り。

そしてインクレメント/デクレメントなんかは「アドレスと整数の混合演算」だと思えばいい。

C言語ではデータの種類によって専用の型を用意するから、整数はintやlong、アドレスは
ポインタを使うと思っておけばいい。

310:Google先生
07/12/28 10:17:12
インクレメント に一致する日本語のページ 約 1,940 件中 1 - 10 件目 (0.20 秒)

もしかして: インクリメント

311:デフォルトの名無しさん
07/12/28 11:01:26
インクリメント デクリメント の検索結果 約 20,700 件中 1 - 10 件目 (0.05 秒)
URLリンク(www.google.co.jp)

インクレメント デクレメント の検索結果 約 544 件中 1 - 10 件目 (0.34 秒)
URLリンク(www.google.co.jp)

検索結果を見ると、インクレメント/デクレメントと読む人もいるようだ。

312:デフォルトの名無しさん
07/12/28 12:52:57
まったく…
K&Rに何と書いてあるか読んでから出直して来い。

313:デフォルトの名無しさん
07/12/28 14:10:56
英語で書いてあるな

314:デフォルトの名無しさん
07/12/28 20:14:54
英語のカタカナ表記を議論することほど無意味なものはない。
ただ、そのあたりを議論したくてしょうがない馬鹿よけ対策として、
市民権のある表現を使うに越したことはない。

315:デフォルトの名無しさん
07/12/28 20:26:25
D→デー
T→テー

と発音するベテラン技術者に食って掛かる新米社員を思い出したw

316:デフォルトの名無しさん
07/12/28 22:39:56
>>299
相互再帰する必要がある時はないと困る。

317:デフォルトの名無しさん
07/12/28 22:42:44
>C言語(シー言語)は、1972年にAT&Tベル研究所のデニス・リッチー (Dennis M. Ritchie) が主体となって作ったプログラミング言語である。

1972当時のマシンでJava並みのコンパイラやアプリなんて起動すらしねぇw

318:デフォルトの名無しさん
07/12/28 22:48:55
おまえは何を

319:デフォルトの名無しさん
07/12/29 16:41:33
テキストエディタ(メモ帳)で、ソースファイルを作ったのですが、
どこのファイルに保存すればいいのか、全く分かりません
どなたか宜しくお願いします

320:デフォルトの名無しさん
07/12/29 16:43:14
自分で決めた場所に自分でフォルダ作って保存しとけ

321:デフォルトの名無しさん
07/12/29 16:44:42
               .|  
               .|  
    ∩___∩    |  
    | ノ\   ,_ ヽ  .|  
   /  ●゛  ● |   .J  
   | ∪  ( _●_) ミ 
  彡、   |∪|   |     
 /     ∩ノ ⊃  ヽ
 (  \ / _ノ |  |
  \  "  /  | |
   \ / ̄ ̄ ̄ /
      ̄ ̄ ̄ ̄

322:デフォルトの名無しさん
07/12/29 16:44:53
マイドキュメントとかに置くとスペースがどーたらではまるから
c:\homeとかc:\srcとかってディレクトリを作ってそこに置け。
コマンドプロンプトを起動したら
cd /d c:\home
と打ってそこに移動してコンパイルしろ。

323:デフォルトの名無しさん
07/12/29 16:58:31
なんか、自分の手違いがあるらしく、「:や¥は、ファイル名には使えません」
と出てしまいます・・・  
どういうことなのでしょうか・・

324:デフォルトの名無しさん
07/12/29 17:00:48
プログラム以前の問題。
Windows のことをもうちょっと勉強しる。

325:デフォルトの名無しさん
07/12/29 17:01:43
:や¥はファイル名に使えるがなんて冗談は置いといて

>>322のはディレクトリ(フォルダ)名

326:デフォルトの名無しさん
07/12/29 17:08:10
Windowsキー+Rでcmdを起動
以下を入力
mkdir c:\home
cd /d c:\home
explorer /n,/e,c:\home
notepad hello.c
gcc hello.c && a.exe

327:デフォルトの名無しさん
07/12/29 17:11:14
beginthreadexに複数の値を渡すコードがわからないのですが、
教えて下さい。

328:デフォルトの名無しさん
07/12/29 17:12:12
>>327
URLリンク(msdn.microsoft.com)

329:デフォルトの名無しさん
07/12/29 17:41:23
何日くらいでマスターできますか?

330:デフォルトの名無しさん
07/12/29 17:44:59
>>329
何を?C?
あんたの今のCの習熟度、他言語について、PCに関する一般知識がどの程度のものか

331:デフォルトの名無しさん
07/12/29 17:48:06
>>330
Cですね
今日はじめた。他言語まったくしらない。PC知識まぁまぁ。

332:デフォルトの名無しさん
07/12/29 17:49:42
1000日くらいがんばれ

333:デフォルトの名無しさん
07/12/29 17:50:13
どの程度を「マスター」と言うのか分からんが、
一通りどんな感じなのか知るのに2ヶ月、
それなりに使えだすのに半年、
十分使えるまでには1〜2年くらいじゃね。

334:デフォルトの名無しさん
07/12/29 17:52:24
がんばるよ

335:デフォルトの名無しさん
07/12/29 17:59:35
C言語の「マスター」と言うと、
・ANSI前(K&R?)の仕様とC89、C99の規格に精通している
・代表的なコンパイラのオプションと処理系定義の仕様が概ね分かる
・上記コンパイラの最適化の仕様がある程度分かる(要アセンブラ?)
代表的なコンパイラ:gcc、VC、BCCぐらい?組込みだとその他もか

辺りだと思うんだがどーか。

336:デフォルトの名無しさん
07/12/29 18:00:37
Linuxカーネルをビルドできたらスーパーハカーです

337:デフォルトの名無しさん
07/12/29 18:04:53
>>335
実務的な知識がなさすぎるだろう

338:デフォルトの名無しさん
07/12/29 18:05:49
コンパイラマスターだな

339:デフォルトの名無しさん
07/12/29 18:17:55
とりあえず正月つぎ込んで入門書読破すりゃマスターしたってことでいいよ。

340:デフォルトの名無しさん
07/12/29 18:25:23
>>335
・Cコンパイラ書いた事がある。

341:323
07/12/29 18:55:56
なんとか意味を理解したつもりで、プログラムの実行段階まで来たのですが

#include <stodio.h>

int main()
{
printf("Hello World!\n");
return 0;
}

のようなソースファイルを実行したらエラーがでました・・・
どこがまずいのでしょうか

342:デフォルトの名無しさん
07/12/29 18:58:03
stodio.h
エラーメッセージ嫁

343:デフォルトの名無しさん
07/12/29 19:01:51
stodio.h

344:323
07/12/29 19:03:08
>>342
どうもすみません
なんとか成功しました! やはり実践しなければ分かりませんね

345:デフォルトの名無しさん
07/12/29 19:26:08
このすっとこどっこいアイオー

346:デフォルトの名無しさん
07/12/29 19:30:49
>>341
ごめん、僕も極最近始めたものだけど、stodioには吹いたw
一緒に頑張ろう!

347:デフォルトの名無しさん
07/12/29 19:37:51
studio とかはたまに見かけるな。

348:デフォルトの名無しさん
07/12/29 19:56:49
stdioも見るな

349:デフォルトの名無しさん
07/12/29 20:04:24
cstdioも見る。

350:デフォルトの名無しさん
07/12/29 20:58:54
>>345
お茶吹いたw

351:デフォルトの名無しさん
07/12/29 22:25:47
みんなどのくらいの年齢でC言語始めるんだろうか
もしかして今の商業高校とかでは教えられているのか?

352:デフォルトの名無しさん
07/12/29 22:40:37
>>351
商業の基本は情報処理だが、
俺のとこじゃ国家試験の勉強が中心
だが、商業でVBをやるところもあったし、JAVAをやるところもある。

353:デフォルトの名無しさん
07/12/29 23:19:04
URLリンク(oshiete1.goo.ne.jp)
この中の
lpPARAM lpParam = (lpPARAM)lpx;
はどのような意味を持っているのですか?

354:デフォルトの名無しさん
07/12/29 23:26:40
>>353
元の関数仕様が void* だから
渡す側が lpPARAM をvoid*にいれて
とりだす側がキャストで戻してる

355:デフォルトの名無しさん
07/12/30 00:05:56
C言語ってポインタとか使うメリットあんの?って感じだけど
難しいから使わなくても大丈夫かな?

356:デフォルトの名無しさん
07/12/30 00:08:16
>>355
その内必要になる時がくる

357:デフォルトの名無しさん
07/12/30 00:15:13
>>355
ポインタのメリットをすぐに理解する必要はないが,必要になったときにすぐに(少し調べて)使える程度に覚えとけ

358:デフォルトの名無しさん
07/12/30 00:17:59
ok
いま独習Cでポインタやってるんだが、まぁある程度理解してるんだが
少し、上に行くと難しいんだよな。
char *bokki ="ちんこが立つ";

printf(bokki);
って場所やってるぜ、こういうのってプロでも使うのか?

359:デフォルトの名無しさん
07/12/30 00:19:36
>>255
使うメリットが無い内は使わなくていいと思うよ
便利だから使うのであって、かつC言語をやっていればそのうち「これはポインタを使った方が楽だ」って状況が出てくる
その時に使えばいいだけの話


まあC++ならまだしも、C言語だと関数との配列の受け渡しとかで
すぐにポインタが必要な状況になるよ

360:デフォルトの名無しさん
07/12/30 00:20:34
>>355
同じアドレスを共有したいときがあるのさ
夫婦だって別々のベッドじゃいやだろ?

361:デフォルトの名無しさん
07/12/30 00:22:17
>>358
まぁリテラル文字列はstaticでconstで領域もconstしちゃうけど

362:デフォルトの名無しさん
07/12/30 00:22:19
Cは難しいなポインタが
もしかして359と360はバリバリ使えるんすか?

363:デフォルトの名無しさん
07/12/30 00:23:39
>>358
const char * str = "俺童貞";
printf("%s", str);

まあdefineの代わりにconstポインタを使うことはあるかもね
defineの代わりとしては
const char* const str = "ヤリてー";
の方がいいかね

364:デフォルトの名無しさん
07/12/30 00:25:40
すごいっすねみなさん
この頭の良さを駆使して、みなさんが作ったプログラムはどんなのありますか?
実用的で使えそうなやつっすよタブを消したり入力した文字をソートしてなんたらしたり

365:デフォルトの名無しさん
07/12/30 00:26:20
>>358
表示したい文字列に%があると見落とすかもよw

366:デフォルトの名無しさん
07/12/30 00:28:41
宇宙に浮かんでるアレの制御プログラム、を作るための支援ツールとか監視システムとか

367:デフォルトの名無しさん
07/12/30 00:29:31
ちなみに私が作ったのは
1,暗号化 2,解読 3,Quit
というやつでシーザー暗号に似た奴ですね。
まだまだへたれですよ


368:デフォルトの名無しさん
07/12/30 00:29:59
文字列のポインタは文字列の実装上使わざるを得ないのでメリットが分かりにくいと思う

369:デフォルトの名無しさん
07/12/30 00:30:44
>>366
本気で言ってるんすか?
知人の凄い人でもATMなのに人工衛星とかの制御プログラムとか次元が違いすぎる

370:デフォルトの名無しさん
07/12/30 00:32:40
最近、どっかの団体のコーディングルールとか見ると、ポインタの演算禁止とか、
ポインタのポインタらしい使いかたはしないって流れになってきてるな。
じゃPascalでも使ってればいいのにって気がするけど。

371:デフォルトの名無しさん
07/12/30 00:32:54
ポインタがどうでも良くなってきたんで。
早くファイル操作などの場所をやりたいんですが、ページを飛ばすと複雑な気持ちになるので
ポインタのページと関数のページを仕方なくやりますか

372:デフォルトの名無しさん
07/12/30 00:33:22
>>369
よく嫁
支援ツールだ
つまりだたの社内ツール

373:デフォルトの名無しさん
07/12/30 00:34:43
実用的なのは作ったこと無いな、所詮娯楽用品止まり。

374:デフォルトの名無しさん
07/12/30 00:35:23
私の書いたコードなら、世に出回っているフラッシュメモリのシェアの多くを生み出す装置の検査に使われているぜw

375:デフォルトの名無しさん
07/12/30 00:35:35
まぁ日曜プログラマならそれでいいんじゃね?
自分の腕を仕事に活かしたいと思ったら、それはそれで地獄をみることになるし

376:デフォルトの名無しさん
07/12/30 00:35:54
>>372
でもすごいっすよ
C言語を始める時期が悪かったですかね
ガキの頃に手をつけとけば良かったと後悔しますよ
Cをマスターしたら次はperlかjavaやろうかと思ってるんすよ

377:374
07/12/30 00:36:39
もっと身近なところでは、某駅ビルの駐車券発行機に使われているとか(ぉぃ

378:デフォルトの名無しさん
07/12/30 00:40:35
去年一年くらいCの仕事をやって、医療関係のシステムだったけど、ありえないくらいコードの質が
低かったから、そのシステムを導入してる病院には行かないことにしてる。怖い。

379:デフォルトの名無しさん
07/12/30 00:40:58
>>376
始めるのに早いも遅いもない
逆にガキのころはガキのころにすべき勉強なり体験なりをしなくちゃいけない
Cなんてただの道具にすぎんのですよ、偉い人にはそれがわからんのです

380:デフォルトの名無しさん
07/12/30 00:41:44
>>374
まじすか?
凄過ぎますよ、是非そういう人に基礎から教えてもらいたいんですが
まぁ無理なんでしょう、自力でやらないと意味がないし
そういうコードを書くにはCを学んでいたときに1日どのくらい書いてましたか?
あとは1日3個適当にプログラムを作るとかそういう目標とかってありましたか?

>>2373
私もそんな感じっすよ
暗号化できたーやーいって(自己満)すよね

>>375
プログラマーになったら大変そうすよね
それで食ってくのは難しいすよね

381:デフォルトの名無しさん
07/12/30 00:44:56
プログラミングの仕事は中国やらインド勢力に取られていくし、
自動生成の流れが盛んになってきているから、
プログラミングの仕事はどんどん減っていくだろうね
現に、カードにパンチしていた時代はコーディングが開発工程の8割を占めていたのに、今では2割程度

382:374
07/12/30 00:46:50
そう言えば某社のFAXに……あれはアセンブラだったな。
某社の検査装置に使われているのは……basicか。

てな具合にいろんな時期にいろんなことをやっていたから「Cを学んでいた(だけの)とき」なんてないよ。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5373日前に更新/237 KB
担当:undef