>>950 たいていif文を使って〜とかfor文を使って〜とかいうやつはそれを習ってるか習ったばかりの段階だからな。
>951
if文20個だけでは済まないような‥‥
954 :
デフォルトの名無しさん:02/02/04 03:10
>>948 EOFが127を超えるという事を聞いたことがあるんだけど、どう対処するの?
955 :
デフォルトの名無しさん:02/02/04 03:34
引数に多次元配列を取るにはどうしたらよいですか?
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);
>>949 うっ、おっしゃるとおりどっちもキャストですね。。。。
#やっぱり、俺アホだ・・
もし良かったら確認させてもらいたいんですが、
> きさ1(char)のところへ大きさ4(int)の物を入れようとすると
> 大きさ3分が切り捨てられるため
って、本当なのでしょうか?
自分のイメージでは、意図しない場所(大きさ3だけ後方)まで書き込んでしまい、
メモリ領域を破壊すると思っていたいのですが・・・・・
その部分は切り捨てられちゃうんですか?
>>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ね。
>>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) );
との違いを理解しろ。
>>964 char a = 128;
printf( "a=%d", a );
結果がどうなるか試してみればいい。
aの値を色々変えてみれば、解かると思う。
>960
つか、君の主張では、
コンパイラは避けられて、又避けるべきな
「メモリ破壊を招くコード」をわざわざ出力する
と言うことになるんだが。
>>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 さんがおっしゃる状況になる。
こんな理解でよろしいでしょうか?
>>966 ありがとうございます。
最初に気がついたのは、代入する値が127以下だと
表示される値が代入した値なのに、128以上だと
負の値が表示されることでした。
これはしばらく考えていたら、情報処理でやった
2の補数の考え方だと言うことに気がつきました。
最終的に確信が持てたのは変数の宣言を
unsigned charにしたときなのですが・・・・
で、さらに
printf("a=%d\n",a);
printf("a=%c\n",a);
などとやっているうちに、なんとか
>>965 でいただいた
課題への回答へいたることが出来ました。
>>967 おっしゃるとおりですね。
そのときの自分は「キャスト」という物に
固執しすぎていたようです。
キャストするならば、コンパイラはこちらの意図通りに
だまされてくれるので、メモリ破壊が起こってしまいますが
そうでなければきちんと切り捨ててくれるんですね。
勉強になりました。
これからも頑張って精進していきます。
なにとぞよろしゅうお願いしますです。
>>968 まだ勘違いしてると思うよ。
その考えでは
*cp = i;
と
memcpy( cp, &i, sizeof(char) );
が同じという事になってしまう。
>>971 説明が悪かったな。
この場合はたまたま結果が同じになるな。
float f; char c;
で
c = f;
と
memcpy( &c, &f, sizeof(char) );
では、結果が違うという事が言いたかった。
そろそろNEWスレかな
>>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頂きたいっす。。。。
>>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 これを参考にしてチョ
>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
とすると和が表示されるはずです。
これを参考に。
有難う御座います
おかげさまでなんとか出来そうな感じになりました
親切にしていただいて、涙がちょちょぎれそうです
多謝
たびたびすみません
okinawakenを ASCIIコードに変換→表示
という部分が上手くいかなくて・・・
申し訳ありませんが教えていただけませんでしょうか
const char* p="osakafu";
while(*p) printf("%x\n",*p++);
>987さん
ご教授、誠に有難う御座います
しかし当方の頭ではコマンドライン引数で入力された文字列に
適用することが出来ませんでした
自分は
printf("%s\n", argv[i]);
↓
printf("%x\n", argv[i]);
このようにフォーマット指定子を変えるだけで
ASCIIコードになると思っていたのですが
全然違うみたいですね・・・・
すみません、分からないです・・・
ヽ(`Д´)ノ
const char* p=argv[i];
while(*p) printf("%x\n",*p++);
>>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;
}
>990さん
>991さん
自分のようなおばかに教えていただき、感謝の極みです
御陰様でやっとできました
大変貴重なレス、有難う御座いました
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 |
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。