C言語なら俺に聞け(入門編)Part 71
■ このスレッドは過去ログ倉庫に格納されています
★前スレ
C言語なら俺に聞け(入門編)Part 70
http://hibari.2ch.net/test/read.cgi/tech/1285490211/
★過去スレ
http://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++の宿題片付けます 140代目
http://hibari.2ch.net/test/read.cgi/tech/1284632294/
★C++言語については避けてください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
# 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
# サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
0002デフォルトの名無しさん
2010/10/10(日) 22:41:49_ ,ノ ,ヘ、、
/´ ノ `ヽ、
/ / ヽ
i′ ,/ ',
{ { }
', `、 ,!
___ヽ ` 丿__,,
, ゝ `ヽ、 /´ く _
<-‐''´  ̄ ̄`,ゝ、、___,,, <´ ̄ ̄` ー->
` ー''´Z_ノ ヽ、_ヾ ー ´
C H I N E S E R E S T A U R A N T
__ __ __ __ __ __ __
`i | | i'l_i'l_i' i''´ __`ヽ-ッ _コ l____ i´__`ー-ッ _,,.、
,! ,! .l l _,,,_ └'´__ ``´ レ┐ ┌─┐ ,!'´ ``´ /,r''´
/ 丿 '、'、 l´ __`ヽ-ッi''´__`ヽ-ッ .l l ノ / / /
/ / ヽ ヾ´ ``'´└'´,,_``'´ l └ ' ,/ ___,,ノ /
_,,.r'' / \ `> r'"´ ``ヽS.) l 「´ 「´ _ノ
‘''' ´ `′ └ ''´ ̄``‐-‐'' └ ┘ └‐ '' ´
0003デフォルトの名無しさん
2010/10/10(日) 22:43:48/´ ̄`ヽ /: : : \_____/: : : : ヽ、
,. -‐┴─‐- <^ヽ、: : : : : : : : : : : : : : : : : : : : : : }
/: : : : : : : : : : : : : :`.ヽl____: : : : : : : : : : : : : : : : : : /
,. -──「`: : : : : : : : : :ヽ: : : : : : : : :\ `ヽ ̄ ̄ ̄ フ: : : : :/
/: :.,.-ァ: : : |: : : : : : : : : :\: : : : :: : : :ヽ \ /: : : :/
 ̄ ̄/: : : : ヽ: : : . . . . . . . . . . .、 \=--: : : :.i / /: : : : :/
/: : ∧: \: : : : : : : : : : ヽ: :\: : : 〃}/ /: : : : :/ 、
. /: : / . : : :! ヽ: : l\_\/: : : : :\: ヽ彡: : | /: : : : :/ |\
/: : ィ: : : : :.i: : | \!___/ ヽ:: : : : : : :\|:.:.:.:/:! ,': : : : / |: : \
/ / !: : : : :.ト‐|- ヽ \: : : : : l::::__:' :/ i: : : : :{ |: : : :.ヽ
l/ |: : :!: : .l: :| \: : : l´r. Y {: : : : :丶_______.ノ: : : : : :}
l: : :l: : :ト、| 、___,ィ ヽ: :| ゝ ノ '.: : : : : : : : : : : : : : : : : : : : : : /
|: : :ト、: |: :ヽ ___,彡 ´ ̄´ ヽl-‐' \: : : : : : : : : : : : : : : : : : イ
!: :从ヽ!ヽ.ハ=≠' , ///// ///u /  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
V ヽ| }/// r‐'⌒ヽ イ〉、
ヽ、______ー‐‐' ィ´ /:/:7rt‐---、 こ、これは>>1乙じゃなくて
ィ幵ノ ./:/:./:.! !: : : : :!`ヽ ポニーテールなんだから
r‐'T¨「 |: | !:.∨:/:./: :| |: : : : .l: : : :\ 変な勘違いしないでよね!
/: : .|: :| !:.!ィ¨¨ヾ、:.:/ !: : : : l: : : : : :.\
0004デフォルトの名無しさん
2010/10/10(日) 22:46:40/´  ̄ ̄ ̄ ̄`ー 、 / /´ ,-‐' Y´ ヽ
/ ヽ / ',
/ i
,' / |
! イ |
| ! │ !
! ヽ │ |
| │ │ !
! │ ,.- 、 │ |
! │ ,... ! r‐、` │ │
| │ /r-、ヽ ゞ‐' j │ ! |
', │ !::ゞィ〃 ゛=" │ |
! │ `ー' │ !
| │ │ !
! │, │ i
| │ ,' ',
| │ │ |
0005デフォルトの名無しさん
2010/10/10(日) 23:15:520006デフォルトの名無しさん
2010/10/11(月) 06:35:53HOGESTRUCT hs = {sizeof hs};
って規格的には大丈夫なんでしょうか?
リテラルパース時にはhsが解決されてるのか、仕様書みてもよくわかりませんでした。
0007デフォルトの名無しさん
2010/10/11(月) 06:52:13というか何が不安なんだ?
0008デフォルトの名無しさん
2010/10/11(月) 08:15:31char *p = (char *)&p;
でもいいんですが、宣言の初期化で宣言元(?)をリテラルに含めていいのか、って話です。
例えばbcc32では下記はエラーになります。gccやtccではOKです。
char *p[] = { (char *)&p };
動作がどーのこーのではなく、規格ではどう定義されてるのか調べてます。
0009デフォルトの名無しさん
2010/10/11(月) 08:42:28他のコンパイラではOKなので、とりあえず宣言の初期化子に代入先のオブジェクトを含めてよい、
ってことにしておきます。仕様上はよくわかりません。
ちなみに仕様はISO/IEC 9899 の6.7.8を参照していました。
/* オマケ:bcc32のおかしな挙動 */
char g;
int main(void)
{
char q;
char *p1[] = {&g}; /* OK */
char *p2[] = {&q}; /* ERROR:E2063 */
return 0;
}
0010デフォルトの名無しさん
2010/10/11(月) 08:59:14gのアドレスはリンク時に解決するから定数扱い。
qのアドレスはローカルだから可変値扱い。
bccはc99に対応していないから可変値で初期化できない。
gccやicc、Sun-OSのccはc99をある程度解釈する。
何の問題もない。
0011デフォルトの名無しさん
2010/10/11(月) 10:00:17VC6.0でエラーにならないなと思ったら/W4で規格外だというエラーがでました。
解決しました、ありがとうございます。
0012デフォルトの名無しさん
2010/10/11(月) 12:18:16↓定数でないものが使える宣言と使えない宣言がある
main()
{
int a = printf(0); /* OK */
int b[] = { printf(0) }; /* NG */
}
>>6 や >>8 の論点は sizeof hs の時点で hs が何のことになっているのか、
&p の時点で p が何のことになっているのかであって、
sizeof や & の結果が定数かどうかではない
0013デフォルトの名無しさん
2010/10/11(月) 13:33:01ループにしたがって
n+1,n+2,n+3,n+4,n+l次元みたいな
0014デフォルトの名無しさん
2010/10/11(月) 14:20:41別に確保はできるよ。
ただし、Cである以上は、確保した領域をどう使うかはプログラマの責任だが
0015デフォルトの名無しさん
2010/10/11(月) 14:56:55それです、本当に知りたかったことはそれなんですが、
どう見ても仕様書には書いてないように思います。
sizeofに戻ると、初期化リテラルのブロック内で自身の最終情報を得るのは不可能です。
変数が配列でないなどの条件付です。以下を考えてみれば分かります。
int a[] = { sizof a, sizeof a };
これはワンパス的なやりかたで実装されてると解決できません(宣言と初期化を完全に分けれません)。
VC6はゼロ初期化で押し通します。
現実のコンパイラでこの辺の挙動は「未定義」といっていい感じなのは分かりました。
だけど配列でない場合は上手くいく、その歯がゆさ。
0016デフォルトの名無しさん
2010/10/11(月) 16:38:56構造体の場合は中身はこれこれって定義があるんだから量が判って当然だし。
0017デフォルトの名無しさん
2010/10/11(月) 17:11:15決め付けはよくないですよ。
例えばtccでは正しく初期化されます。
0018デフォルトの名無しさん
2010/10/11(月) 18:22:53アホか
0019デフォルトの名無しさん
2010/10/11(月) 19:45:33お騒がせしました。
0020デフォルトの名無しさん
2010/10/11(月) 20:05:01printfで"●"をX回表示させるにはどうすればいいですかね?
0021デフォルトの名無しさん
2010/10/11(月) 20:06:53をX個書く
0022デフォルトの名無しさん
2010/10/11(月) 20:09:36なるほど、ありがとうございました
0023デフォルトの名無しさん
2010/10/11(月) 22:14:48いえいえ
0024デフォルトの名無しさん
2010/10/11(月) 23:26:14俺にもお礼いえよ
0025デフォルトの名無しさん
2010/10/11(月) 23:29:05ありがとうございました
0026デフォルトの名無しさん
2010/10/11(月) 23:29:54どういたしまして
0027デフォルトの名無しさん
2010/10/11(月) 23:40:570028デフォルトの名無しさん
2010/10/12(火) 07:02:010029デフォルトの名無しさん
2010/10/12(火) 11:13:550030デフォルトの名無しさん
2010/10/12(火) 17:13:44int a;
int *p_a;
a= 100; ←ここで定義するとエラーとなりました。
p_a = &a;
return 0;
}
どうしてなんでしょう?
0031デフォルトの名無しさん
2010/10/12(火) 17:14:590032デフォルトの名無しさん
2010/10/12(火) 17:22:24半角に直してもダメみたいです。
0033デフォルトの名無しさん
2010/10/12(火) 17:26:060034デフォルトの名無しさん
2010/10/12(火) 17:43:08ここでは宣言できないと言われました。
a=100;を削除したところ通りました。 どうしてでしょうか?
0035デフォルトの名無しさん
2010/10/12(火) 17:48:58codepadに問題のソースを貼り付けたまえ。
0036デフォルトの名無しさん
2010/10/12(火) 17:52:46int a;
a = 100;
int *p_a;
ってなってるんだろ
0037デフォルトの名無しさん
2010/10/12(火) 17:55:120038デフォルトの名無しさん
2010/10/12(火) 17:55:29適当な翻訳しなくていいからエラーコード全部出せって
0039デフォルトの名無しさん
2010/10/12(火) 17:57:530040デフォルトの名無しさん
2010/10/12(火) 18:00:05構造体を引数にして構造体内の配列をコピー渡ししたいのですが
構造体定義でint a[9]と長さが指定されているものならコピーされましたが
構造体定義でint *aとし、使うときにmallocした配列だとコピーされないように感じます。
可変長配列の場合はできないのでしょうか?
0041デフォルトの名無しさん
2010/10/12(火) 18:01:070042デフォルトの名無しさん
2010/10/12(火) 18:03:20004340
2010/10/12(火) 18:07:43aを配列として扱ってるのはおまえの勝手だろ ってことですか。
では関数の引数に可変長の配列をコピーで渡したい場合はどうしたらいいのでしょうか?
0044デフォルトの名無しさん
2010/10/12(火) 18:07:530045デフォルトの名無しさん
2010/10/12(火) 18:10:190046デフォルトの名無しさん
2010/10/12(火) 18:12:260047デフォルトの名無しさん
2010/10/12(火) 18:29:310048デフォルトの名無しさん
2010/10/12(火) 18:38:37できない
0049デフォルトの名無しさん
2010/10/12(火) 18:40:01コピーされるのは *a でなく a
0050デフォルトの名無しさん
2010/10/12(火) 19:00:35printf("%d万",100);の場合、%dに右側の100という文字列を
代入するという考え方で合ってるでしょうか?
0051デフォルトの名無しさん
2010/10/12(火) 19:03:500052デフォルトの名無しさん
2010/10/12(火) 19:12:52そんなこと知らなくてもCを使うのに困ることはないよ。
その上でどうしても知りたいなら、使ってるコンパイラのソースを入手しなさい。
規格で決まってるのは「どういう結果になるか」だけ。
「どう実現するか」はコンパイラ次第。
0053デフォルトの名無しさん
2010/10/12(火) 19:13:560054デフォルトの名無しさん
2010/10/12(火) 19:22:29"R:\a"の部分を"b"とすると正常に処理されました。解決策はありますか?
#include <stdio.h>
int main(void)
{
char *oldname = "a";
char *newname = "R:\a";
if( rename( oldname, newname ) == 0 ){
printf( "Rename successflly from %s to %s", oldname, newname );
}
else{
printf( "Rename failed" );
}
return 0;
}
0055デフォルトの名無しさん
2010/10/12(火) 19:36:340056デフォルトの名無しさん
2010/10/12(火) 20:01:41ありがとうございました。
リネーム先が"R:\\a"ではまだエラーが出てしまうのですが、試しに"C:\\b"とするとリネームしてくれるので構文に間違いないと思います。
色々粘ってみます。
0057デフォルトの名無しさん
2010/10/12(火) 20:07:05R:\で実行してないか?
R:\aをR:\aにリネームはできないよ。
0058デフォルトの名無しさん
2010/10/12(火) 20:15:03そういうのはリネームじゃなくて移動っていうんだ
0059デフォルトの名無しさん
2010/10/12(火) 20:17:21ありがとうございます。
C:\に実行ファイルとディレクトリ"a"を置いてやってます。R:\はramdiskです。
0060デフォルトの名無しさん
2010/10/12(火) 20:21:270061デフォルトの名無しさん
2010/10/12(火) 20:24:43ありゃりゃ、方法からマズかったですか。
調べなおして書き直すことにします。ありがとうございました。
0063デフォルトの名無しさん
2010/10/12(火) 23:03:49pathの指定方法が間違っていないかい?
ドライブルートは/cygdriveの下にマウントされる。
char *newname = "R:\a";
ではなくて
char *newname = "/cygdrive/r/a";
だと思うよ。
試しにls /cygdriveに何がマウントされているか、確かめてみて。
006454
2010/10/13(水) 00:04:49>>62
いえいえ、>>54みたいな稚拙でイミフな質問を適切に解釈してくださるエスパーの方々には頭が上がりません
>>63
早速以下のように改造のうえコンパイルしてC:\で走らせてみました。
#include <stdio.h>
int main(void)
{
char *oldname = "a";
char *newname = "/cygdrive/r/a";
if( rename( oldname, newname ) == 0 ){
printf( "Rename successfly from %s to %s", oldname, newname );
}
else{
printf( "Rename failed : %s",newname );
}
return 0;
}
するとDOSプロンプト上で次のように結果が得られました。
Rename failed : /cygdrive/r/a
この時プログラムはWindowsディスク上に/cygdrive/r/aを作ろうとしてるんでしょうか?
ちなみにnewnameを"R:\\a"とすると次のようになりました。
Rename failed : r:\a
0065デフォルトの名無しさん
2010/10/13(水) 00:12:10006663
2010/10/13(水) 01:01:06>するとDOSプロンプト上で次のように結果が得られました。
cygwin bash shell上で実行しないとだめだよ。
このコードで期待通りに動いているよ。
#include <stdio.h>
int main(void)
{
char *oldname = "input.txt";
char *newname = "/cygdrive/c/hoge.txt";
if( rename( oldname, newname ) == 0 ){
printf( "Rename successflly from %s to %s\n", oldname, newname );
} else {
printf( "Rename failed\n" );
}
return 0;
}
実行結果
$ ./main
Rename successflly from input.txt to /cygdrive/c/hoge.txt
0067デフォルトの名無しさん
2010/10/13(水) 01:48:10cygwinはどっちも受け付ける
>>64
R:\もC:\もWindowsの中だろ
だからさあファイルシステムを跨いだrename()は無理だっつーの
0068デフォルトの名無しさん
2010/10/13(水) 02:05:26errnoなんてライブラリがあるんですね。勉強になります。
>>66
cygwinのbash上でそのプログラムを実行してみたのですが、同じ結果でした。errnoは2でnot foundみたいでした。私の環境か方法が悪いのだと思います。
その前に元プログラムの*newname = "r:\\a"で試してみたらerrno=13 (permission denied)が出力されました。
というかそのプログラムさえ動かないのは何かマズいミスを犯してる気がするので、明日落ち着いてまた走らせてみます。
>>67
やや、やっぱり私の試してる通りの方法は無理ですか。なんとかAPIを利用しないやり方をと思ったのですが・・・
WindowsAPIの部分をコンパイルするには該当するヘッダファイルを導入すればいいのかな?
色々実験しながらのレスとはいえ、アドバイスを下さる方々に不躾な部分があったかもしれません。お詫び申し上げます。
重ね重ねありがとうございます。
0069デフォルトの名無しさん
2010/10/13(水) 02:12:310070デフォルトの名無しさん
2010/10/13(水) 05:32:170071デフォルトの名無しさん
2010/10/13(水) 06:08:410072デフォルトの名無しさん
2010/10/13(水) 10:02:43コロンつきのパスを解釈するのはシェルがコマンドラインをパースするときだろ。
アプリ内からライブラリ呼ぶときまでは受け付けてくれないんじゃないかと思うが。
つーか、cygwinスレに行けばいいよ。
0073デフォルトの名無しさん
2010/10/13(水) 10:55:44{
char res67[256];
printf(">>72 つーか、cygwinスレに行けばいいよ。\n");
gets(res67);
if (res67 ==">>67:cygwinスレ行かない\n")
{
printf("俺:>>72\n釣りだろ\n");
}
}
0074デフォルトの名無しさん
2010/10/13(水) 11:07:200075デフォルトの名無しさん
2010/10/13(水) 17:21:540076デフォルトの名無しさん
2010/10/13(水) 17:23:01お前にそれを言う資格はない
0077デフォルトの名無しさん
2010/10/13(水) 17:26:370078デフォルトの名無しさん
2010/10/13(水) 17:32:41一度痛い目を見ておくべき
0079デフォルトの名無しさん
2010/10/13(水) 18:03:350080デフォルトの名無しさん
2010/10/13(水) 18:09:090081デフォルトの名無しさん
2010/10/13(水) 18:09:560082デフォルトの名無しさん
2010/10/13(水) 18:11:310083デフォルトの名無しさん
2010/10/13(水) 18:14:000084デフォルトの名無しさん
2010/10/13(水) 18:25:060085デフォルトの名無しさん
2010/10/13(水) 18:34:25どれも正しくない場合は訂正してください。
1. static char *str = (char *)malloc( sizeof(char) * 10 );
2. static char *str = (static char *)malloc( sizeof(char) * 10 );
0086デフォルトの名無しさん
2010/10/13(水) 18:34:560087デフォルトの名無しさん
2010/10/13(水) 18:38:02ごめん。個数は変数で与えられいて動的に確保しなければならない場合は?
0088デフォルトの名無しさん
2010/10/13(水) 18:41:32if (!str) str = malloc(個数);
0089デフォルトの名無しさん
2010/10/13(水) 18:42:36>>85と言ってることが矛盾してる=釣り
0090デフォルトの名無しさん
2010/10/13(水) 18:42:58WindowsもLinuxもCで書かれているのに古き良きもないもんだ
0091デフォルトの名無しさん
2010/10/13(水) 18:44:00初期化してないのに参照できるんですか?
0092デフォルトの名無しさん
2010/10/13(水) 18:46:12C++と勘違いしてね?
0093デフォルトの名無しさん
2010/10/13(水) 18:49:09WindowsはC++だが?
0094デフォルトの名無しさん
2010/10/13(水) 18:50:29バーカCだよ
MSDN良く見てみろ
俺も最初はC++だと勘違いしていた口だ
0095デフォルトの名無しさん
2010/10/13(水) 18:52:360096デフォルトの名無しさん
2010/10/13(水) 18:53:27そうですか。
ようは何がしたいかというと呼び出した関数内で静的領域(配列)を動的に確保して
それに値代入して、そのアドレスを返したいんですけど、
こういう場合はどうやって領域確保すりゃいいんですか?
0097デフォルトの名無しさん
2010/10/13(水) 18:54:49VisualBasicかC#を使う
0098デフォルトの名無しさん
2010/10/13(水) 18:55:33Cじゃできんってこと?
0099デフォルトの名無しさん
2010/10/13(水) 18:55:51あたらしい仕様で俺様言語を策定する
0100デフォルトの名無しさん
2010/10/13(水) 18:57:51どうして静的領域じゃないとだめなん?
ヒープ領域ではだめな理由があるの?
0101デフォルトの名無しさん
2010/10/13(水) 18:59:15エンジンに翼を付けて飛ばしたいのか?
翼にエンジンを付けて飛ばしたいのか?
■ このスレッドは過去ログ倉庫に格納されています