C の超カンタンなことなら漏れに聞け

このエントリーをはてなブックマークに追加
>>950

たいていif文を使って〜とかfor文を使って〜とかいうやつはそれを習ってるか習ったばかりの段階だからな。
>951
if文20個だけでは済まないような‥‥
954デフォルトの名無しさん:02/02/04 03:10
>>948
EOFが127を超えるという事を聞いたことがあるんだけど、どう対処するの?
955デフォルトの名無しさん:02/02/04 03:34
引数に多次元配列を取るにはどうしたらよいですか?
>>955
Cに多次元配列はない。
957デフォルトの名無しさん:02/02/04 03:41
え?
958クワサワ先生:02/02/04 04:01
http://www.puchiwara.com/hacking/

/ | | | |ヽ                               @ノノヽヽヽ@
|( ゚〜゚ )| ノノノ人ヽ_ (ノ~\\        ノノノノ从ヘ ノノノノヽヽ (0^〜^0)
|(   )| (●´ー`●) (`.∀´) ノハヽヽ.  |( ´Д` )| 从^▽^从 (   )
 | | |  (    )  (   ) 从 ^◇^ 从 |(   )|  (   )  .| | |
 | | |  | |   |  ||| (    )  |||   | | |   | | |
(_)__)  (__)_) (__)_) (_)_)   (_)__)  (_)__) (_)__)
 飯田    安倍    保田   矢口    後藤    石川   吉澤

           ノノノノヽヽ  .ノノノノ从ヘ   / | | | |ヽ
∋oノハヽヽo∈ ∬`▽´∬ 川’ー’川  川o・-・)   ◎ノ^^ヽ◎  @ノハ@
  ( ´D`)    (   )   (   )   (   )  §(´・e・`)§  (‘д‘ )
  (   )    |||   |||   |||    (   )   (   )
  (_)_)   (_)__)   (_)__)    (_)__)   (_)_)   (_)_)
     辻     小川    高橋      紺野     新垣     加護
>>655
void test(int **ip);
960948=910:02/02/05 00:45
>>949

うっ、おっしゃるとおりどっちもキャストですね。。。。
#やっぱり、俺アホだ・・

もし良かったら確認させてもらいたいんですが、
> きさ1(char)のところへ大きさ4(int)の物を入れようとすると
> 大きさ3分が切り捨てられるため

って、本当なのでしょうか?
自分のイメージでは、意図しない場所(大きさ3だけ後方)まで書き込んでしまい、
メモリ領域を破壊すると思っていたいのですが・・・・・
その部分は切り捨てられちゃうんですか?
961948=910:02/02/05 00:49
>>954

す・すんまそん・・・・
おっしゃることが理解できないです。

EOFはマクロだろうというところまでは頭が働いたので
適当にヘッダーファイルを漁ったところ
stdio.hの中に

#define EOF (-1)

つうのを見つけました。
この値が場合によって(処理系によって?)127を超える値になると言うことでしょうか?

で、そのようになった場合、自分が質問させてもらっていた
事にどのような影響があるんでしょうか?
またもや、スレのタイトル通り超カンタンな事をお聞きしてますでしょうか?
ヒントでも良いので、教えてもらえませんか?
#マジ頼むっす
char c; int i; char*cp = &c;
で、
*c = i;       なら、cで表現できないデータが失われるかも、ってだけ。
*(int*)c = i; なら、メモリ破壊。
この違いがおわかりか?
あ、いかん。下の方の*cとかは*cp,*(int*)cpね。
964960:02/02/05 01:56
>>962

うぅ、、、、、これは俺が試されているんだろう。
ここでしくじったら、二度と質問に答えてもらえないかも
#プレッシャー!!!

ということで、猿なので一度にはわかりませんので
順を追って考えさしてください。

char c; 値(1バイト)が格納される
int i;    値(4バイト)が格納される
char *cp= &c; 変数cの値が格納されているアドレスを*cpに代入  //かなり理解があやしいぃ。。。

で、

*cp = i; 4バイト分の値(i)を、変数cpが示す先のアドレスへ入れる。
変数cpは&cが代入されているから、1バイト分のアドレス領域
>>メモリ破壊
*(int *)cp = i; アドレスcpが指し示す先には4バイト分のデータ領域があるとコンパイラに、
無理矢理信じ込ませる。→cpをint *でキャストしているので
で、そのアドレスが指し示す先に4バイト分の値(i)を代入
でも実際は1バイト分(&c)しかない。
>>メモリ破壊

下側は何となくこれで良いような気がしますです。
上は・・・・・????
くぅ、こんなにメモリの事を考えてコード読んだのはじめてっす。
この1文書くのに1時間かかりました。
必死に考えました、マジで悔しいっす。
お願いみしゅてないでぇ〜〜〜〜(T_T)
>>964
*cp = i;

memcpy( cp, &i, sizeof(int) );
との違いを理解しろ。
966965:02/02/05 16:38
>>964
char a = 128;
printf( "a=%d", a );
結果がどうなるか試してみればいい。
aの値を色々変えてみれば、解かると思う。
>960
つか、君の主張では、
 コンパイラは避けられて、又避けるべきな
 「メモリ破壊を招くコード」をわざわざ出力する
と言うことになるんだが。
968964=910:02/02/06 02:23
>>965
たびたびお騒がせしております
本日もたりない頭を絞ってみました

>*cp = i;

4byte分(int i)の値を、1byte分(char cp)確保されている
場所へコピーしようとするが、賢いコンパイラが
余った3byte分を破棄してくれて、
意図しない結果になるがメモリ破壊は起こらない。

>memcpy( cp, &i, sizeof(int) );

変数iの値が確保されているアドレス(&i)を先頭として、
4byte分(=sizeof(int))の内容をを変数cpが指し示す
アドレスから4byte分の領域へ無理矢理コピーする。
が、cpはchar型なので本当は1byte分しか
メモリ領域が確保されていない為メモリ破壊が起こる。

ここまでは、よかでしょうか?

で、キャストというのはmemcpyと同じように無理矢理
内容をコピーしてしまうために >>962 さんがおっしゃる状況になる。
こんな理解でよろしいでしょうか?
969964=910:02/02/06 02:38
>>966
ありがとうございます。

最初に気がついたのは、代入する値が127以下だと
表示される値が代入した値なのに、128以上だと
負の値が表示されることでした。
これはしばらく考えていたら、情報処理でやった
2の補数の考え方だと言うことに気がつきました。
最終的に確信が持てたのは変数の宣言を
unsigned charにしたときなのですが・・・・

で、さらに

printf("a=%d\n",a);
printf("a=%c\n",a);

などとやっているうちに、なんとか >>965 でいただいた
課題への回答へいたることが出来ました。
970960=910:02/02/06 02:41
>>967
おっしゃるとおりですね。
そのときの自分は「キャスト」という物に
固執しすぎていたようです。

キャストするならば、コンパイラはこちらの意図通りに
だまされてくれるので、メモリ破壊が起こってしまいますが
そうでなければきちんと切り捨ててくれるんですね。
勉強になりました。

これからも頑張って精進していきます。
なにとぞよろしゅうお願いしますです。
971965:02/02/06 11:06
>>968
まだ勘違いしてると思うよ。
その考えでは
*cp = i;

memcpy( cp, &i, sizeof(char) );
が同じという事になってしまう。
972971:02/02/06 11:32
>>971
説明が悪かったな。
この場合はたまたま結果が同じになるな。

float f; char c;

c = f;

memcpy( &c, &f, sizeof(char) );
では、結果が違うという事が言いたかった。
973あぼーん:02/02/06 19:40
そろそろNEWスレかな
974968=910:02/02/07 02:03
>>971=972
ま、まだダメっすか・・・・
ちょっと鬱かもしれない。

> float f; char c;
> で
> c = f;

4Byte分のfloatの値(数値)を1Byte分のcharの
値へ(文字コードとして)代入しようとするが、
余分な3Byte分は切り捨てられる。
よって、メモリ破壊は起こらない。
(結果は意図した物にはならないが、
エンディアンにより一定の規則性あり?)

> memcpy( &c, &f, sizeof(char) );

変数fが格納されているアドレス(&f)から
1byte分(sizeof(char))のアドレスを
変数cが格納されているアドレス(&c)へコピーする。
メモリ破壊は起こらないが意図した結果にならない。

って、こう考えてしまうんですが、
わざわざお題を考えていただいているんだから
この答えじゃおかしいんですよねぇ。
なんか、まじめにこんがらがってきました。

足りない頭がマジむかつくっ!!
次スレに移行するまでにはOK頂きたいっす。。。。
975972:02/02/07 19:08
>>974
>(結果は意図した物にはならないが、
>エンディアンにより一定の規則性あり?)
c=fはキャスト変換なんだよ。
明示的キャスト変換になっていないから、いい書き方だとはいえないけど。
(本当はc=(char)fと書くべき)
結果は意図したものになるんだよ。
キャスト変換はメモリコピーとは違う。

以下の部分をコンパイルして実行してみたらわかる。
解かりやすいように、charじゃなくてshortを使ってみた。
fの値をいろいろ変えてみると解かると思うけど。
s = f の結果は意図したものになってる。


float f;
short s;
f = 1234.56789;

s = f;
printf("s = f -> %d\n",s);

memcpy( &s, &f, sizeof( short ) );
printf("memcpy -> %d\n",s);
976デフォルトの名無しさん:02/02/14 20:50
char *f="1000.TXT";
のようにした場合、
"1001.TXT"と変えることは無理でしょうか?
>976
char *f = "1000.TXT";
f = "1001.TXT";
で何か問題でも?
ありがとうございまする。
そんな簡単にできるとは・・・。

char型はなんだかよーわかりません。。。
コマンドライン引数を使って"okinawaken"を入力して
ASCIIコードに変換→表示というプログラムを作りたいんですが・・・
宜しくお願いします
int main(int argc, char *argv[])
{
int i;
for(i = 1; i < argc; i++){
printf("%s\n", argv[i]);
}
return 0;
}
>>979
これを参考にしてチョ
981979:02/02/14 21:16
>980さん
早速のレス有難う御座います
この場合、okinawakenはどうやって入力させればいいのでしょうか

初心者質問ですみません
オロオロ。あっしも初心者でげす。
まずexe作って、
hoge.exeだったとしたら、
DOSプロンプトから
hoge.exe okinawaken
と打てばよいのではないでしょうか。
test.exe okinawaken[Enter]
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int i;
int tmp=0;
for(i = 1; i < argc; i++){
printf("%s\n", argv[i]);
tmp=tmp+atoi(argv[i]);
}
printf("コマンドライン引数の和は%d",tmp);
return 0;
}
これはコマンドライン引数の和を求めるプログラムで、
これをhoge.exeにして、c:\に移動して、
DOSから
cd c:\
hoge.exe 100 20
とすると和が表示されるはずです。
これを参考に。
985979:02/02/14 21:39
有難う御座います
おかげさまでなんとか出来そうな感じになりました
親切にしていただいて、涙がちょちょぎれそうです
多謝
986979:02/02/14 21:51
たびたびすみません
okinawakenを ASCIIコードに変換→表示
という部分が上手くいかなくて・・・
申し訳ありませんが教えていただけませんでしょうか
const char* p="osakafu";
while(*p) printf("%x\n",*p++);
988979:02/02/14 22:31
>987さん
ご教授、誠に有難う御座います
しかし当方の頭ではコマンドライン引数で入力された文字列に
適用することが出来ませんでした
989979:02/02/14 22:50
自分は
printf("%s\n", argv[i]);

printf("%x\n", argv[i]);
このようにフォーマット指定子を変えるだけで
ASCIIコードになると思っていたのですが
全然違うみたいですね・・・・
すみません、分からないです・・・
ヽ(`Д´)ノ
const char* p=argv[i];
while(*p) printf("%x\n",*p++);
991偽下部恵子 ◆GpSwX8mo :02/02/14 23:30
>>989
これじゃだめかしら。

#include <stdio.h>
int main(int argc,char *argv[])
{
int i;
for(i=0;i < argc;i++){
int d=0;
while(argv[i][d] != '\0') printf("%x",argv[i][d++]);
putchar('\n');
}
return 0;
}
992979:02/02/14 23:41
>990さん
>991さん
自分のようなおばかに教えていただき、感謝の極みです
御陰様でやっとできました
大変貴重なレス、有難う御座いました
C言語なら、俺に聞け! <12>
http://pc.2ch.net/test/read.cgi/tech/1012348974/

に吸収かな。内容大して違わないし。
1000ゲッターにはおいしいスレだな
            ヘ-+------+--+-----+ヽ_
          /:::|:::::::|:::::::::::::/::::::/::::::::::::::/:::::::/`\_
       / ̄\::::::|:::::/:::......-―――--..........__/:::::::::::::::\
   ┌ー ̄::::::::::::ヽ::|:::..-^ ̄            ^ ヽ、:::::::::\
   ヽ::::::::::::::::::::::::::::/ 今だ995            \::::::::ヽ
    ヽ:::::::::::::::::::::::/    ゲットー     ::::       \:::::ヽ
    ヽ::::::::::::::::::/   ズザーー       ::::::::        \::::|_
     ):::::::::::::::|              ::::*:::::        ヽ:|::::ヽ
     /::::::::::::::::|              ::;;;;:          l::::::::ヽ
    /::::::::::::::::::|             ノ::ii:ヽ::          l::::::::::|
    |::::::::::::::::::::|            /::::;リ:::l::::         |::::::::::::|
    |:::::::::::::::::::::l           ...l::::;リ:::/::         /:::::::::::::|
    .|::::::::::::::::::::::l          . /:ア/:::        /:::::::::::::::i
    l:::::::::::::::::::::::::l          ./::`^:::::        /:::::::::::::::::/
    ヽ::::::::::::::::::::::::l         /::::::::::        /:::::::::::::::::::/
     /:::::::::::::::::::::::l        /:::::::::::::      /::::::::::::::::::::::/
     /::::::::::::::::::::::::i __-ー--=;;;::::::::::::::  ....::::/:::::::::::::::::::::::/
    ./:::::::::::::::::::::::::::i":::::::::::::::  ヾ─ 、/"ヽ:/::::::::::::::::::::::::::::l
     ヽ::::::::::::::::::::::丶::::::::::   /   il   .ヽ:::::::::::::::::::::::::::/
       \::::::::::::::::::::ヽ:::::::  /    l !    ヽ:::::::::::::::::::/
         ii::::::::::::::::::` -::-/     / .i     ヽ::::::::/
          ----- ̄丶/     lヽ       ヽ/
                /      l ^ヽ..      ヽ
                /      l   ヽ      .ヽ
               l       .l    ヽ      /
               丶      l     ヽ      .l
               ヽ      l     l     /
                ヽ___../      .ヽ---/
996get
∋oノハヽo∈/ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ( ´D`) < こんにちわぁ〜
= ⊂   )   \_______
= (__/"(__) トテテテ...

∋oノハヽo∈ / ̄ ̄ ̄ ̄ ̄ ̄ ̄
○( ´D` )○< つぃののみれす!
 \   /   \_______
   しし))ミ ピョ-ン

∋oノハヽo∈ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ( ´D`) < きょうはせんをげっとしにきたのれす
  ∪   )  \_______________
  (_)_)
∋oノノハヽヽo∈  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 (´D`≡´D`) < られもいましぇんね?ののがせんげっとしちゃいましゅよ?
   (⊃ ⊂)    \________________________
   (_)_)
いまら!999げっとぉぉぉなのれす!
 ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄(´´
  ∋oノハヽo∈   )      (´⌒(´
  ⊂(´D`⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
        ̄ ̄  (´⌒(´⌒;;
      ズザーーーーーッ

らにみてるのれす、てれるらないれすか!
 ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ポ∋oノハヽo∈ ポ
  ン (´D` #)    ン
   (´;) U,U )〜 (;;).
(´)〜(⌒;;UU (´ )...〜⌒(`)
いまら!せんげっとぉぉぉなのれす!!
 ̄ ̄ ̄ ̄∨ ̄ ̄ ̄       (´´
  ∋oノハヽo∈        (´⌒(´
  ⊂(´D`⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
          ̄ ̄  (´⌒(´⌒;;
      ズザーーーーーッ

   |        ?
   |       ̄∨ ̄             (´´
   |     ∋oノハヽo∈ )       (´⌒(´
   人    ⊂(´D`⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
  (  )      | ̄ ̄ ̄ ̄ ̄ ̄ (´⌒(´⌒;; ̄ ̄
    ̄       |  ズザーーーーーッ
            |

    |
    |               (´´
    |!            (´⌒(´
∋oノハヽo∈      (´⌒;;;≡≡≡
  (´D`; )⌒つ  | ̄ ̄ ̄ ̄ ̄ (´⌒(´⌒;; ̄ ̄
 ⊂  ̄U      |
              |

   |
   | プラ〜ン
   |
∋oノ|ヽo∈
 ( / ⌒ヽ     | ̄ ̄ ̄ ̄ ̄ ̄ ̄
  U    )      |
    UU       |
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。