<div dir="ltr">Awesome, thank you!  I was a bit lost - learnt a lot from exploring this though. <div><br></div><div>Cheers, Mike</div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Dec 4, 2023 at 12:11 AM Even Rouault <<a href="mailto:even.rouault@spatialys.com">even.rouault@spatialys.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi Michael,<br>
<br>
It was most missing a "break;" statement when the subdataset of interest <br>
has been found to exit the loop. Without the break, the loop will <br>
continue to read papszSubdatasets[] which has been invalidated by the <br>
poSrcDS->ReleaseRef(). Ah, memory unsafe languages :-). You also had a <br>
few memory leaks.<br>
<br>
Fixed version:<br>
<br>
#include "gdal.h"<br>
#include "gdal_priv.h"<br>
#include <iostream><br>
int main(int argc, char **argv) {<br>
   GDALAllRegister();<br>
<br>
   auto poSrcDS =<br>
     GDALDataset::Open(argv[1], GDAL_OF_RASTER, nullptr, nullptr, nullptr);<br>
   if (poSrcDS == nullptr)<br>
   {<br>
     return 0;<br>
   }<br>
   char **papszSubdatasets = poSrcDS->GetMetadata("SUBDATASETS");<br>
   int nSubdatasets = CSLCount(papszSubdatasets);<br>
   if (nSubdatasets > 0)<br>
   {<br>
     for (int j = 0; j < nSubdatasets; j += 2)<br>
     {<br>
       char* pszSubdatasetSource = CPLStrdup(strstr(papszSubdatasets[j], <br>
"=") + 1);<br>
       GDALSubdatasetInfoH info = <br>
GDALGetSubdatasetInfo(pszSubdatasetSource);<br>
       char* component = info ? <br>
GDALSubdatasetInfoGetSubdatasetComponent(info) : NULL;<br>
       const bool bFound = component && EQUAL(argv[2], component);<br>
       CPLFree(component);<br>
       GDALDestroySubdatasetInfo(info);<br>
       if ( bFound) {<br>
         std::cout << pszSubdatasetSource << "\n";<br>
         poSrcDS->ReleaseRef();<br>
         poSrcDS = GDALDataset::Open(pszSubdatasetSource, <br>
GDAL_OF_RASTER, nullptr, nullptr, nullptr);<br>
         CPLFree(pszSubdatasetSource);<br>
         break;<br>
       }<br>
       else {<br>
         CPLFree(pszSubdatasetSource);<br>
       }<br>
     }<br>
   }<br>
<br>
   poSrcDS->ReleaseRef();<br>
   return 1;<br>
}<br>
<br>
Even<br>
<br>
<br>
Le 03/12/2023 à 05:10, Michael Sumner via gdal-dev a écrit :<br>
> #include "gdal.h"<br>
> #include "gdal_priv.h"<br>
> #include <iostream><br>
> int main(int argc, char **argv) {<br>
>   GDALAllRegister();<br>
><br>
>   auto poSrcDS =<br>
>     GDALDataset::Open(argv[1], GDAL_OF_RASTER, nullptr, nullptr, nullptr);<br>
>   if (poSrcDS == nullptr)<br>
>   {<br>
>     return 0;<br>
>   }<br>
>   char **papszSubdatasets = poSrcDS->GetMetadata("SUBDATASETS");<br>
>   int nSubdatasets = CSLCount(papszSubdatasets);<br>
>   char *pszSubdatasetSource = nullptr;<br>
>   if (nSubdatasets > 0)<br>
>   {<br>
>     for (int j = 0; j < nSubdatasets; j += 2)<br>
>     {<br>
>       pszSubdatasetSource = CPLStrdup(strstr(papszSubdatasets[j], "=") <br>
> + 1);<br>
>       GDALSubdatasetInfoH info = <br>
> GDALGetSubdatasetInfo(pszSubdatasetSource);<br>
>       if ( EQUAL(argv[2], <br>
> GDALSubdatasetInfoGetSubdatasetComponent(info))) {<br>
>         std::cout << pszSubdatasetSource << "\n";<br>
>         poSrcDS->ReleaseRef();<br>
>         poSrcDS = GDALDataset::Open(pszSubdatasetSource, <br>
> GDAL_OF_RASTER, nullptr, nullptr, nullptr);<br>
>         CPLFree(pszSubdatasetSource);<br>
>         GDALDestroySubdatasetInfo(info);<br>
><br>
>       }<br>
>     }<br>
>   }<br>
><br>
>   poSrcDS->ReleaseRef();<br>
>   return 1;<br>
> }<br>
<br>
-- <br>
<a href="http://www.spatialys.com" rel="noreferrer" target="_blank">http://www.spatialys.com</a><br>
My software is free, but my time generally not.<br>
<br>
</blockquote></div><br clear="all"><div><br></div><span class="gmail_signature_prefix">-- </span><br><div dir="ltr" class="gmail_signature">Michael Sumner<br>Software and Database Engineer<br>Australian Antarctic Division<br>Hobart, Australia<br>e-mail: <a href="mailto:mdsumner@gmail.com" target="_blank">mdsumner@gmail.com</a></div>