トップページ⇒tech
1001コメント351KB

【初心者歓迎】C/C++室 Ver.44【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/11/03(土) 00:20:13
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.43【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1190860744/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
05545462007/11/28(水) 12:51:48
>>552
550で書いているソースがインクルードしていたものを
一応すべてインクルードしてみたんですが,だめでした….

>>553
コンパイルできなかったです.
0555デフォルトの名無しさん2007/11/28(水) 12:58:35
>>554
bcc5.5.1で>>546のソースコンパイルできたよ
ファイルが壊れてるかもしれんから、再インストールしてみ
0556デフォルトの名無しさん2007/11/28(水) 12:58:37
>>554
そりゃなんかおかしいね
bcc再インストールしてみた方がいいかもしんない
05575462007/11/28(水) 13:20:32
再インストールをしてみたら,無事にコンパイルできました!
お騒がせしました.みなさん本当にありがとうございました!
0558デフォルトの名無しさん2007/11/28(水) 18:14:23
すいません、仮想関数とか継承とかで頭がこんがらがってきたので教えてください
仮想関数を含むオリジナルクラスを継承したクラスのインスタンスをnewしてそのポインタを
オリジナルクラスにキャストしてもう一度もとのクラスにキャストし直したもどした場合は
正常に動作するのですが、オリジナルクラスに仮想関数が含まれない場合はコンパイラエラーが出ます、
これは仮想関数を含むオリジナルクラスのインスタンスの場合だけそのクラスを継承したポインタにキャストできるということなのでしょうか?
この場合、オリジナルクラスのインスタンスには継承先の情報が無いと思うのですがどこから持ってきてるのでしょうか?

ついでにもうひとつお願いします
newでインスタンスを作成した場合deleteしなければ、プログラム終了まで有効なのでしょうか?
例えば関数の中でnewを行いクラスのポインタを変数に格納してそれを関数の引数として戻してnewを行った関数の外で使用しても
最後にdeleteさえすれば大丈夫なのでしょうか?

乱文失礼しましたが、よろしくお願いします。





0559デフォルトの名無しさん2007/11/28(水) 18:29:41
>仮想関数を含むオリジナルクラスのインスタンスの場合だけそのクラスを継承したポインタにキャストできる
dynamic_castの話なら、そのとおり。仮想関数を持たないクラスには働かない。
継承先の情報はインスタンスが隠し持ってる仮想関数テーブルに入ってる。
そもそもそれがなきゃ仮想関数の呼び先を解決できない。

deleteしなければプログラム終了まで有効。その続きのも大丈夫。
deleteし忘れてどんどんnewしてるとそのうちメモリを食い尽くすから要注意。
0560デフォルトの名無しさん2007/11/28(水) 18:54:52
>>559
回答、ありがとうございます。
これでやっと先にすすめそうです。
0561デフォルトの名無しさん2007/11/28(水) 18:59:42
最近deleteがdelegateに見えてしょうがないんだがもうダメなのか?
0562デフォルトの名無しさん2007/11/28(水) 19:04:58
だめだね。あの手の便利すぎる機能はプログラマの脳を破壊する。
0563デフォルトの名無しさん2007/11/28(水) 19:37:45
本物のプログラマは○○を使わない

【○○にはお好きな(またはお嫌いな)単語をお入れください】
0564デフォルトの名無しさん2007/11/28(水) 19:38:21
本物のプログラマはコンドームを使わない
0565デフォルトの名無しさん2007/11/28(水) 19:39:46
本物のプログラマは有給を使わない
0566デフォルトの名無しさん2007/11/28(水) 19:53:16
すいません、もうひとつお願いします。
関数内で仮想関数を含むオリジナルクラスを継承したクラスのインスタンスをnewでつくりそのポインタを
オリジナルクラスにキャストして関数の引数として返し、そのポインタをもう一度継承後のクラスにキャストした場合、
オリジナルクラスに存在しない継承後のクラスが持っているメンバ変数の値が維持されているのを確認できたのですが
この部分の値もずっと保持されるであってますか?
0567デフォルトの名無しさん2007/11/28(水) 20:03:54
- 本物のプログラマは有給を使わない
+ 本物のプログラマは有給を使えない
0568デフォルトの名無しさん2007/11/28(水) 20:11:30
>>563
そういうネタはマ板の方がいいんじゃね
0569デフォルトの名無しさん2007/11/28(水) 20:13:07
>>566
合ってる
ポインタをいくらキャストしてもインスタンスの実際のクラスが変わったりはしない
0570デフォルトの名無しさん2007/11/28(水) 20:31:14
>>569
回答、ありがとうございます
0571デフォルトの名無しさん2007/11/28(水) 20:36:46
本物のプログラマは言葉を使わない
0572デフォルトの名無しさん2007/11/28(水) 21:05:56
>>566
それはダウンキャストと言うのは知ってるね
dynamic_castは何をしようとするのかプログラマが知ってる限り
問題はない
0573デフォルトの名無しさん2007/11/28(水) 21:24:52
どうでもいいけど(いや、よくないけど)関数が返す物は引数じゃないんじゃね?
0574デフォルトの名無しさん2007/11/28(水) 23:00:01
3つほど質問させてください

・C++にはキャストがいくつかありますが、それぞれの役割がよく分かりません。詳説願います。

・inline関数についてですが、同一ソース中でないとinline展開されえないですか?

・演算子オーバーロードにおいて左オペランドに自作関数をとる演算子等を定義する場合、
通常のメンバ関数のような形式で定義するのと通常のグローバル関数のような形式で定義するのにはどのような違いがありますか?
bool Foo::operator +(Foo rhs)とbool operator +(Foo lhs,Foo rhs)みたいなののことです

よろしくお願いします
0575デフォルトの名無しさん2007/11/28(水) 23:09:03
>>574
http://www.google.co.jp/search?q=C%2B%2B+%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88
0576デフォルトの名無しさん2007/11/28(水) 23:31:54
>>574
オブジェクト間最適化機能のあるコンパイラなら、別のコンパイル単位にある関数でも
インライン展開され得る。
0577デフォルトの名無しさん2007/11/28(水) 23:41:11
■キャスト
詳説せず、厳密さも気にせず簡単にまとめるとこんな感じ。
・const の付け外し→const_cast
・標準変換、およびその逆変換→static_cast
・安全な downcast や crosscast→dynamic_cast
・A→B→Aで戻る以外は実装依存→reinterpret_cast

■inline
同一ソースって何?
規格上は基本的に同一翻訳単位に inline 関数の定義がないと駄目だし(ただし定義前に呼び出しがあってもOKと書いてあった)、翻訳単位間で定義が一致する必要がある。
最適化としての inline 化なら最近は >576 らしい。Exceptional C++ Style にもそんなことが書いてあった。

■演算子オーバーロード
×自作関数
○自作クラス
だとして、メンバ関数にすると第 1 引数がその自作クラスの場合に限定される。
例えば、Foo() + 1 はどちらでも実現可能だけど、 1 + Foo() はメンバ関数で実現することができない。
0578デフォルトの名無しさん2007/11/28(水) 23:46:00
ごめん。
>左オペランドに
って明示してあった。
その場合は、operator+() が class Foo が定義されている namespace 内で定義されている限りはほとんど変わらないと思う。
もちろんメンバに対するアクセス制限は異なるけど。
0579デフォルトの名無しさん2007/11/29(木) 01:07:40
質問があります。
C言語(linux gcc)にて、テキストファイルの指定した一行を読み込んだ後に、
その行を削除する処理を行いたいのですが、何か手立てはありませんでしょうか?

無理言って申し訳ないのですが、別ファイルに指定行以外をコピーした後ファイルのリネームを行う、
もしくはメモリにファイル内容を確保し、指定行以外をファイルに上書きすると言う手法以外で
何か解決手段をご教授いただければと思います・・・。
よろしくお願いします。
0580デフォルトの名無しさん2007/11/29(木) 01:09:48
削除するってことは、その削除した部分を埋めるように後ろのデータをずらしてくるってことだ
つまり、それをやればよい
0581デフォルトの名無しさん2007/11/29(木) 01:54:00
後ろのデータを前にずらしながら書き込んで、最後にファイルサイズを小さくするのを忘れないでね。
0582デフォルトの名無しさん2007/11/29(木) 02:16:17
そうは言うがな大佐、メモリに読み込まずにどうやってずらすというのだ。
0583デフォルトの名無しさん2007/11/29(木) 07:37:02
一文字ずつ読んでシーク位置を一定数戻して書くを繰り返す
それでは時間がかかるので適当なバッファを用意してある程度まとめて読んでまとめて書く

て定石はさておいて
メモリに読み込まずにずらす方法を考えようか
アセンブラでレジスタだけ使ってどうにかならんかね
0584デフォルトの名無しさん2007/11/29(木) 07:58:01
>>575-578
サンクスサンクスサンクス
参考になりますた
0585デフォルトの名無しさん2007/11/29(木) 08:11:39
今までの常識を打ち破る画期的なファイルシステムを創造すればよくね?

例えば、ブロック単位で読み書きするのではなく
1バイトごとにリスト構造にして持つとか。
0586デフォルトの名無しさん2007/11/29(木) 08:18:51
テキストファイルやめてデータベースにすればいいとおもうよ
0587デフォルトの名無しさん2007/11/29(木) 12:32:01
そのファイルをメモリにマップしてmemmove
0588デフォルトの名無しさん2007/11/29(木) 20:35:17
VC++ 6.0 WinXP ともに ProEditionで開発しています。
DLLを作成し、そのDLLの関数にCWnd型(MFCのやつです)のポインタを渡そうと思って、次のようなコードを書いてみましたが、
上手く渡りません。問題としてはCWnd::m_hWndの値が変わってしまうというものです。
以下にコードをあげます。

//DLL
void CTestClass::TestFunc(CWnd* pWnd)
{
TRACE(_T("TestFunc 0x%08x \n"), pWnd->m_hWnd);
}

//EXE
void CTestDialog::OnOK()
{
CTestClass test;
TRACE(_T("OnOK 0x%08x \n"), m_hWnd);
test.TestFunc(this);
}

このようにして、処理を行うと出力されるm_hWndの値が変わってしまいます。
理由をご存知の方がいらっしゃいましたら、教えてください。
よろしくお願いします。
0589デフォルトの名無しさん2007/11/29(木) 20:50:59
CTestDialogで新しくm_hWndメンバ変数を作っちゃったとか?
0590デフォルトの名無しさん2007/11/29(木) 20:54:35
C言語で最後がNULLで終わっている双方向リストを
マージソートするにはどうすればいいのでしょうか?
普通のマージソートなら出来るのですが
双方向の場合どうすればいいのか解りません;;
0591デフォルトの名無しさん2007/11/29(木) 21:31:42
逆向きのリンクを気にせず、単方向リストとして扱いながらソートする
その後、ソートしたリストを順方向に辿りながら、逆向きのリンクを張りなおす
0592デフォルトの名無しさん2007/11/29(木) 21:59:51
>>591
おおー、その発送はありませんでした
無事できましたありがとう^^
0593デフォルトの名無しさん2007/11/29(木) 22:31:14
テキストがUNICODEなら、削除する文字を、
ZERO-WIDTH系の文字に置換しとけばよくね?
0594デフォルトの名無しさん2007/11/29(木) 22:34:42
>>589
回答ありがとうございます。ですが、それは違いました。
0595デフォルトの名無しさん2007/11/29(木) 22:42:35
それぞれ見ているMFCが、DLL->DLL版MFCで
EXE->スタティクリンクしたMFCで違う、みたいな話ではない?
0596デフォルトの名無しさん2007/11/29(木) 23:07:08
TRACE(_T("TestFunc 0x%08x 0x%08x \n"), pWnd->m_hWnd, &(pWnd->m_hWnd));
TRACE(_T("OnOK 0x%08x 0x%08x \n"), this->m_hWnd, &(this->m_hWnd));
とりあえずDLL,EXE両方が同じアドレスを参照出来ているかを確かめてみようか。
0597デフォルトの名無しさん2007/11/30(金) 00:26:19
VC6で開発しています。
あるISequentialStreamのオブジェクトstreamにデータが入っていて、Readメソッドで
vector< char > buf;
buf.reserve( MAX );

for ( 読み終わるまでループ ) {
 buf.resize( buf.size() + size );
 stream.Read( &buf[ 0 ], size, read );
}

のように、size単位でデータをバッファに格納しようとしています。
データのサイズは1KB〜130MBほど、MAXは余裕をもって150MB、sizeは1MBです。
このstreamはあるライブラリ(Soap Toolkit 3.0)で提供されているもので、内部の実装は
どうなってるかわかりません。
上記でデータ自体は取ってこれるんですが、非常に時間がかかってしまいます。
3GHz、2GメモリのPCで3分とか…。
メモリに格納するだけでこんなに時間がかかる訳ないと思うんですが、Readのやり方が
間違っているのでしょうか?
sizeが1MBなのは、小さいサイズのデータの方がほとんどで100MBクラスはまれである
ということと、

buf.resize( MAX );
stream.Read( &buf[ 0 ], MAX - 1, read );

のように、一回で全部読み込もうとしたときに、Readの返値のHRESULTが不明なエラーを
示す値を返し、readが0になるという現象が起きるのが理由です。
この原因もわかってないです。
ISequentialStreamとかは使ったことないので、どう使うのが正しいのかよく分からない状況です。
教えていただけると助かります。よろしくお願いします。
0598デフォルトの名無しさん2007/11/30(金) 02:42:18
>3GHz、2GメモリのPCで3分とか…。
そんなものだよ。正常。
0599デフォルトの名無しさん2007/11/30(金) 03:15:23
ストリームが読み取るデータを用意するのに時間がかかっているんじゃないの?
0600デフォルトの名無しさん2007/11/30(金) 14:58:28
>>595,596
sizeof(CWnd)を出力してみて、違う値が出てきたので、色々確認した結果、
>>595さんの言う通りの話でした。

ありがとうございます。
0601デフォルトの名無しさん2007/11/30(金) 20:29:34
9,6,4,7,12,14,1,11,10,15,3,5,8,13,2を小さいものから順に並び替える関数です。

0 #include<stdio.h>
1 void quicksort(int x[],int n){
2 int m;
3 int *pa=x+2. *pz=x+n
4 if(n==2){
5 if(x[1]>x[2])m=x[1],x[1]x[2],x[2]=m;
6 return;
7 }
8 while(pa<pz){
9 while(pa<=x+n && *pa<x[1])pa++;
10 while(pz>=x+2 && *pz>=x[1])pz--;
11 if(pa<pz)m=*pa, *pa++=*pz, *pz--=m;
12 }
13 if(pa>x+2)m=x[1],x[1]=*(--pa),:pa=m;
14 if(pa-x>2)quicksort(x,pa-1-x);
15 if(x+n-pz>1)quicksort(pz.x+n-pz);
16 }

これの8〜12行目の部分は、9行目で前から数列の6,4,7,12まで進み、
10行目で後ろから2まで進み、12と2を交換するという意味であってますか?
0602デフォルトの名無しさん2007/11/30(金) 21:44:31
再発明やめてqsortを使えばいい
0603デフォルトの名無しさん2007/11/30(金) 22:06:45
何かと思えば行番号か
0604デフォルトの名無しさん2007/11/30(金) 23:54:11
今日からC言語の勉強を開始しようと思っていますが、初心者でも使いやすい
コンパイラーあれば、教えて頂けないでしょうか?
ちなみにVisual C++ 2005 Express Edition持ってます、使えますでしょうか?
0605デフォルトの名無しさん2007/11/30(金) 23:57:53
それで充分。
0606デフォルトの名無しさん2007/11/30(金) 23:58:46
うむ
0607デフォルトの名無しさん2007/12/01(土) 00:03:29
早速使ってみました。
とりあえずコピペで、ちゃんとコンパイルできるか見てみましたが、
エラーなにがおかしいですか?

// test.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
int i;

for(i = 0; i < 10; i++)
printf("i = %d\n", i);

printf("end.\n");

return 0;
}
0608デフォルトの名無しさん2007/12/01(土) 00:05:09
日本語でおk
0609デフォルトの名無しさん2007/12/01(土) 00:14:15
>>608 すまなかった
Visual C++ 2005 Express Editionのプロジェクトを開けて、コード記入する欄が
できたので、上のように試しにコードを貼り付けして デバッグというボタン押したら、
エラーになりました。コードのどこがおかしいのでしょうか
0610デフォルトの名無しさん2007/12/01(土) 00:24:47
エラー内容書かない理由は?

stdio.hをincludeしてないからだと思うけど
0611デフォルトの名無しさん2007/12/01(土) 00:34:17
ありがとうございます。

#include"stdio.h"と入力すればよろしいでしょうか
0612デフォルトの名無しさん2007/12/01(土) 00:35:51
コード書く前に基本的な勉強しろ
0613デフォルトの名無しさん2007/12/01(土) 00:44:13
また「エラーになりました」か。
死んでほしいな、こういうヤツ。
0614デフォルトの名無しさん2007/12/01(土) 03:28:40
関数 kansu()があるとします はじめにkansu_init()を使ってデータを生成したとしてkansu()でも使えるようにするにはどうしたらいいですか?
グローバル変数にして使いたいのですが
0615デフォルトの名無しさん2007/12/01(土) 03:29:52
組み合わせnCr=n!/r!(n-r)!を計算するプログラムでポインタを使って値を返さないものを作らなきゃいけません。

void (int x, int *pt)
{

int i;

i = 0; *pt = 1;
while (i < x) {
++i; *pr = *pt * i;
}
printf("factorial called, %3d!=%12ld\n", x, *pt);
}

最初の定義をこんな風につくったんですがダメなとこを指摘してください。
06166142007/12/01(土) 03:31:05
関数内でグローバル変数を定義することは出来ませんか?
0617デフォルトの名無しさん2007/12/01(土) 03:35:54
>>615
>void (int x, int *pt) 
関数の名前がない

>>616
関数の外でグローバル変数を定義すればいいじゃん
何か問題があるのか?
06186142007/12/01(土) 03:37:00
>>617
わかりました 外に定義します
0619デフォルトの名無しさん2007/12/01(土) 03:42:11
>>616
そもそもグローバル変数が何かをわかってないだろ。
06206152007/12/01(土) 03:43:09
>>617
void factorial(int x, int *pt);
こうですか
0621デフォルトの名無しさん2007/12/01(土) 03:57:01
Visual C++ 8 で Win アプリを作りながら勉強しようと思ってるんですが、
Cの標準ライブラリの関数を使おうとしたら色々とエラーが出てきました。
で、MSDNを読んでみたら、

1. 標準関数の strlen とかは危険だから _strnlen_l みたいなVCの独自関数を使え。
2. WinAPI は char の時代は終わったから TCHAR や _tcs 系の関数を使え。

ってことが書いてありました。
警告を減らせば char 型やCの標準関数も使えるみたいですが、
このままVC独自色に染まってしまった方が良いのでしょうか?
0622デフォルトの名無しさん2007/12/01(土) 04:10:05
counter=i;


for (counter=i ;counter<=i+9;counter++) {・・・

for文が苦手です。この一文はどういうふうに解釈してよいか
わかりません。解説して頂けないでしょうか
0623デフォルトの名無しさん2007/12/01(土) 04:16:41
for( 式1; 式2; 式3 )
{
文
}

は

式1
while( 式2 )
{
文
式3
}

と殆ど同じ。
こうすればわかるか?

counter=i;
while( counter <= i+9 )
{
/* 何か */
counter++;
}
0624デフォルトの名無しさん2007/12/01(土) 04:19:07
実行してみればいいじゃん、どうなるか
0625デフォルトの名無しさん2007/12/01(土) 04:25:29
>>621
なるべく標準的にしたいなら標準で
速度を優先したいならWindows APIなどで
0626デフォルトの名無しさん2007/12/01(土) 05:17:00
>>621
なぜstrlenが危険といわれるのか?scanfやprintf、strcpyなどもそう
なぜcharを使用しなくなったのか?
それをちゃんと知っておいたほうがいい。
VC色に染まってもいいが、VC以外で開発するときに代替案がすぐに
浮かぶようであれば問題ないと思う。
標準準拠を目標にして自作するのもいいし、危険とされる関数を
ラッピングして安全なものを作るのでもいい(←この時はpragmaで警告抑制)
0627デフォルトの名無しさん2007/12/01(土) 06:55:28
MSDNの売り文句そのままですが、
標準関数は関数の方でバッファサイズをチェックしてなかったり文字列が '\0' で終了していないと止まらなかったりで危険。
VC 版は必ずバッファサイズと最大長を指定させていて、文字列が長すぎたりする時は途中で打ち切ってくれるので安全。
ってことですよね。

char は...Win9x は内部的に char 型だったけど最近のXPとかは内部的に UNICODE だから?

一緒に買ってきた教科書には当然のごとく _strnlen_l とか何にも載っていないんですが、
VC流で勉強しても教科書探しとか他の人との情報交換とかの妨げにならないか心配です。
0628デフォルトの名無しさん2007/12/01(土) 07:27:17
安全なバッファサイズと最大長はどこからやってくるのか問い詰めたい
0629デフォルトの名無しさん2007/12/01(土) 07:39:53
size_t strlen (const char * str){
const char *eos = str;
while( *eos++ ) ;
return( eos - str - 1 );
}
koeeeee!!!
0630デフォルトの名無しさん2007/12/01(土) 07:41:22
size_t strnlen(const char *str, size_t maxsize) {
size_t n;
for (n = 0; n < maxsize && *str; n++, str++);
return n;
}
よs
0631デフォルトの名無しさん2007/12/01(土) 07:43:47
引数に渡すバッファサイズはバッファの確保時点で決まるはずだし、
打ち切って欲しい長さはやりたいことやプログラムの仕様によって決まるはず。
例えば文字列が100文字未満か100文字以上かで分岐させたいとき、
strlen だと'\0'が見つかるまで暴走を続けるが
strnlen_lなら「とりあえず100文字目までに'\0'はなかった」と帰ってきてくれる。
それ以外の場合でも「これ以上長いのは怪しいから扱いません」って断れるはず。
0632デフォルトの名無しさん2007/12/01(土) 07:44:50
それが安全だと思い込むことの方がよっぽど危険なんだが。
0633デフォルトの名無しさん2007/12/01(土) 07:58:09
それは詭弁
0634デフォルトの名無しさん2007/12/01(土) 08:01:06
普通のstrlenと最大バッファ長指定のstrlenどっちがより安全かと言う話で
しかもその為のコストは極僅かときたもんだ
少なくともその部分でのオーバーフローの可能性は無くなる
まぁ大抵の人はこんなもの出る前から自作のセーフなライブラリ作って使ってたけどね
0635デフォルトの名無しさん2007/12/01(土) 08:11:35
詭弁君をひさしぶりにみた
0636デフォルトの名無しさん2007/12/01(土) 08:24:28
質問です。
123456.jpg
123.jpg
このようファイル名の、数字のところだけを抜き出したいんです。
数字のところの長さは変わります。
そこでとりあえず、
char argnum[10];
hogeStrcpy(argv[1], argnum);
void hogeStrcpy(char *origin, char *number){
int i;
for(i = 0; origin[i] != '¥x2e'; i++){
number[i] = origin[i];
}
}
みたいなださださな物を書いてみたのですが、
引数の数字が短かかった場合、表示するとargnumにゴミが残ってしまいます。
なんとか数字だけをコピーしたいのですが、何か良い方法はないでしょうか?
0637デフォルトの名無しさん2007/12/01(土) 08:28:06
>>633は一体何が誤りだと言ってるんだ?
0638デフォルトの名無しさん2007/12/01(土) 08:35:55
>>636
atoi("123456.jpg")とかじゃなくて?
そうでないならsscanf("123456.jpg", "%[^.]", buf)って話かな。
0639デフォルトの名無しさん2007/12/01(土) 08:52:40
思い込むもなにもstrlenとstrnlen_lどっちが安全ってstrnlen_lに決まってるべ。
strnlen_lが十分に安全じゃなかったとしても、strlenはそれ以上に危険なんだから。
0640デフォルトの名無しさん2007/12/01(土) 09:02:09
>>638
atoi完全に存在を忘れてました。
ありがとうございます。
0641デフォルトの名無しさん2007/12/01(土) 09:05:29
>>636

>引数の数字が短かかった場合、表示するとargnumにゴミが残ってしまいます。

文字列の長さがargnumの配列サイズ以下、ってことか?
argnumを初期化するか、hogeStrcpyの最後で'\0'を入れればいい。
06426362007/12/01(土) 09:34:44
>>638
>>641
すいません。atoiでは駄目みたいです。
やりたいことは、
絶対パス
/usr/boku/graphic/123456.jpg
/usr/boku/graphic/1234.jpg
で渡される引数を、
/usr/boku/graphic/123456
/usr/boku/graphic/1234
で切り出して、
/usr/boku/graphic/123456hoge.jpg
/usr/boku/graphic/1234meso.jpg
みたいな感じで書き出したいんです。
/usr/boku/graphic/123456
/usr/boku/graphic/1234
の長さが変わるので、
配列argnum以下の長さだった場合、
argnumにゴミが残ってしまうんです。
で、別に文字列として表示する訳ではないので、
argnumを0で初期化したり、最後に'¥0'を入れたとしても、
/usr/boku/graphic/12345600hoge.jpgや
/usr/boku/graphic/12340000meso.jpg
みたいになるんじゃないかなと。
何か良い方法はないでしょうか?
0643デフォルトの名無しさん2007/12/01(土) 09:39:25
>>642
"0"と'\0'は違う。
ヌルターミネートでぐぐれ
0644デフォルトの名無しさん2007/12/01(土) 09:58:37
グラフィックを使うために、
Borland 用のGRWINをインストールしました。

#include <stdio.h>
#include "GrWin.h"


int main(){
GWinit();
GWopen(0);
GWindow(-1,-1,1,1);
GWline(-1,-1,1,1);
}

のプログラムのコンパイルが通りません。


Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_GWinit' が未解決(C:\BORLAND\PRG\GRWIN\DEBUG\MAIN.OBJ が参照)
Error: 外部シンボル '_GWopen' が未解決(C:\BORLAND\PRG\GRWIN\DEBUG\MAIN.OBJ が参照)
Error: 外部シンボル '_GWindow' が未解決(C:\BORLAND\PRG\GRWIN\DEBUG\MAIN.OBJ が参照)
Error: 外部シンボル '_GWline' が未解決(C:\BORLAND\PRG\GRWIN\DEBUG\MAIN.OBJ が参照)

** error 1 ** deleting Debug\grwin.exe

インストールがちゃんとできてないんでしょうか??


0645デフォルトの名無しさん2007/12/01(土) 10:04:51
>>644
libはちゃんとリンクしてんの?
0646デフォルトの名無しさん2007/12/01(土) 10:09:18
>>645
それはなんですか?Includeフォルダには grwin.hがインストールされてますが・・・・
06476362007/12/01(土) 10:14:28
>>643
アルェー。
ビックリ。
出来てしまいました。
ヌルターミネートって何なんですか?
調べた限り、¥0との違いが良くわかんなかったです。
配列に文字列を代入した場合、0が続くと文字の終端になる?
1230000000005みたいな物だった場合もうまくいくのは何故ですか?
0648デフォルトの名無しさん2007/12/01(土) 10:16:07
>>646
自分の環境くらい晒してくれ
grwinは使ったことないが、
http://gimite.net/bcbqtree/qtreemain.cgi?mode=thread&thread=753
とか見る限りヘッダには宣言しかされてなくて、libファイルをリンクしないと駄目なんだろ、たぶん
0649デフォルトの名無しさん2007/12/01(土) 10:22:30
>>648
リンク先みたらわかりました!助かりました。
ありがとうございました
0650デフォルトの名無しさん2007/12/01(土) 12:22:39
char *ch;
int i;

で定義したchar型のデータに変数を代入したいんですが、どうすればいいですか?

pt = "ほげほげ";

はできるんですが、 

ほげほげ i みたいに変数の値も代入するやりかたがわからないです
0651デフォルトの名無しさん2007/12/01(土) 12:23:10
pt = "ほげほげ";

は
ch = "ほげほげ";

でした
0652デフォルトの名無しさん2007/12/01(土) 12:23:25
>>647
'0'は、0の文字コードをあらわします。(値としては0x30)
'\0'は、値として0をあらわします

文字列と言うのは、char型の配列であるので、
たとえば、"1230005"と言う文字列は、

31,32,33,30,30,30,35,0

と言う風に入っていると考えれば大体問題ないかと

ちなみに、 ""で括るのと、''で括るのでも意味が違うので、注意してください。
0653デフォルトの名無しさん2007/12/01(土) 12:35:08
>>650
>char *ch;
これは、char型のポインタです。char変数のアドレスもしくは、
配列の先頭アドレスを入れるものです。

>ch = "ほげほげ";
これは、わかりやすく言うと、実行プログラム中に、
"ほげほげ"という文字列が確保されていて、
そこの先頭アドレスをchに代入しているだけのことです。

>ほげほげ i みたいに変数の値も代入するやりかたがわからないです
いまいちやりたいことがわからないのですが、
変数の値を文字列にして、ほげほげのあとに追加するのなら、
charの配列をある程度確保しておいて、そこに、ほげほげをコピーして、
その後ろに文字列に変換した数字をコピーすればいい。

なんにせよ、ポインタをきちんと理解しておいたほうがいいですよ。
■ このスレッドは過去ログ倉庫に格納されています